简单工厂模式(Simple Factory)
2. 工厂方法模式(Factory Method)
3. 抽象工厂模式(Abstract Factory)
每种方法的实现不同
提供一个简单工厂模式的案例:
public abstract class Woman {
private String mySkill
public String getMySkill() {
return mySkill
}
public Woman() {
//System.out.println("我是女人")
}
public void setMySkill(String mySkill) {
this.mySkill = mySkill
}
}
----------------------------
public class LovelinessWoman extends Woman{
/*
* 可爱型女人
*/
public LovelinessWoman()
{
String mySkill="撒过颂肆娇、出过轨、誉樱掘勾引领导下过水"
this.setMySkill(mySkill)
}
}
-----------------------------
public class SteelinessWoman extends Woman{
/*
* 冷酷型女人
*/
public SteelinessWoman()
{
String mySkill="装过神庆核、弄过鬼,跟别人老公亲过嘴"
this.setMySkill(mySkill)
}
}
--------------------------------------
public class WomanMakeFactory {
public Woman findWoman(int typeID) {
switch (typeID) {
case 1:
return new LovelinessWoman()
case 2:
return new VirtuousWoman()
case 3:
return new SteelinessWoman()
default:
return null
}
}
public Woman findWoman(String type) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
/*
* Type t = Type.GetType("SimpleFactory." + type)
* Woman wm =
* (Woman)Activator.CreateInstance(t)return wm
*/
String string="cn.jbit.design.simplefactory."+type
Class c = Class.forName(string)
Woman wm = (Woman) c.newInstance()
return wm
}
}
-------------------------
调用
public class Test2 {
/**
* @param args
* @throws IllegalAccessException
* @throws InstantiationException
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Scanner input=new Scanner(System.in)
boolean sel=false
do {
System.out.println("请选择你要找的女人的类型")
System.out.println("LovelinessWoman:可爱型女人 VirtuousWoman:善良型女人 SteelinessWoman:冷酷型女人")
String typeid=input.next()
WomanMakeFactory factory = new WomanMakeFactory()
Woman wm=factory.findWoman(typeid)
System.out.println("该类型女人的新标准:")
System.out.println(wm.getMySkill())
System.out.println("还想看看别的类型吗?y代表想,n代表再也不想了")
sel=input.next().equals("y")
} while (sel)
}
}
简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。那么简单工厂模式是在什么场景下使用呢,下面就以本人的理解举例说明:
就拿登录功能宽渣来说,假如应用系统需要支持多种登录方式如:口令认证、域认证(口令认证通常是去数据库中验证用户,而域认证则是需要到微软的域中验证用毁缓户)。那么自然的纤巧模做法就是建立一个各种登录方式都适用的接口,如下图所示:
public interface Login {
//登录验证
public boolean verify(String name , String password)
}
public class DomainLogin implements Login {
@Override
public boolean verify(String name, String password) {
// TODO Auto-generated method stub
/**
* 业务逻辑
*/
return true
}
}
public class PasswordLogin implements Login {
@Override
public boolean verify(String name, String password) {
// TODO Auto-generated method stub
/**
* 业务逻辑
*/
return true
}
}
我们还需要一个工厂类LoginManager,根据调用者不同的要求,创建出不同的登录对象并返回。而如果碰到不合法的要求,会返回一个Runtime异常。
public class LoginManager {
public static Login factory(String type){
if(type.equals("password")){
return new PasswordLogin()
}else if(type.equals("passcode")){
return new DomainLogin()
}else{
/**
* 这里抛出一个自定义异常会更恰当
*/
throw new RuntimeException("没有找到登录类型")
}
}
}
测试类:
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
String loginType = "password"
String name = "name"
String password = "password"
Login login = LoginManager.factory(loginType)
boolean bool = login.verify(name, password)
if (bool) {
/**
* 业务逻辑
*/
} else {
/**
* 业务逻辑
*/
}
}
}
简单工厂模式的结构如下图:
我们可以设想一下真实的场景,如果把上面的Test当做一个servlet的话,当客户端发起登录请求——>请求交给服务端的Servlet——>Servlet根据客户端传递的loginType调用工厂类LoginManager的factory()方法——>factory()方法根据参数loginType创建相应的登录验证类(DomainLogin或PasswordLogin)并返回——>登录验证类调用方法verify()验证用户名密码是否正确
假如不使用简单工厂模式则验证登录Servlet代码如下(假设Test为一个Servlet,变量loginType、name、password表示从客户端传递过来的参数):
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
String loginType = "password"
String name = "name"
String password = "password"
//处理口令认证
if(loginType.equals("password")){
PasswordLogin passwordLogin = new PasswordLogin()
boolean bool = passwordLogin.verify(name, password)
if (bool) {
/**
* 业务逻辑
*/
} else {
/**
* 业务逻辑
*/
}
}
//处理域认证
else if(loginType.equals("passcode")){
DomainLogin domainLogin = new DomainLogin()
boolean bool = domainLogin.verify(name, password)
if (bool) {
/**
* 业务逻辑
*/
} else {
/**
* 业务逻辑
*/
}
}else{
/**
* 业务逻辑
*/
}
}
}
上面的代码会不会很蛋疼啊。。。呵呵
《JAVA与模式》一书中使用java.text.DataFormat类作为简单工厂模式的典型例子叙述。
简单工厂模式的优点
模式的核心是工厂类。这个类含有必要的逻辑判断,可以决定在什么时候创建哪一个登录验证类的实例,而调用者则可以免除直接创建对象的责任。简单工厂模式通过这种做法实现了对责任的分割,当系统引入新的登录方式的时候无需修改调用者。
简单工厂模式的缺点
这个工厂类集中了所以的创建逻辑,当有复杂的多层次等级结构时,所有的业务逻辑都在这个工厂类中实现。什么时候它不能工作了,整个系统都会受到影响。
这个应该比较简单一点。
某系统日志记录器要求支持多种日志记录方式,如文件记录、数据库记录等,且用户可以根据要求动态选择日志记录方式。现使用工厂方法模式设计该系统,并写出相应Java代码。
interface Log{
public void writeLog()
}
class FileLog implements Log{
public void writeLog(){
System.out.println("文件记录")
}
}
class DatabaseLog implements Log{
public void writeLog(){
System.out.println("数据库记录")
}
}
interface LogFactory{
public Log createLog()
}
class FileLogFactory implements LogFactory{
public Log createLog(){
return new FileLog()
}
}
class DatabaseLogFactory implements LogFactory{
public Log createLog(){
return new DatabaseLog()
}
}
public class Client{
public static void main(String[] args) {
try{
Log log
LogFactory factory
//这里可以改成使用DOM和Java反射机制读取XML文件,获取工厂类名
兄敏 factory=new DatabaseLogFactory ()
log=factory.createLog()
羡段枝 log.writeLog()
}
燃宽 catch(Exception e){
System.out.println(e.getMessage())
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)