工厂模式(Factory Pattern)用于将大量有着共同接口的类实例化,工厂模式可以动态地决定将哪一个类实例化。
工厂模式有以下集中分类:
简单工厂模式:又称为静态工厂方法模式。
工厂方法模式:又称为多态性工厂模式。
抽象工厂模式:又称为工具箱模式。
简单工厂模式的结构如下所示:
单例模式可以看做是简单工厂模式的特殊形式,工厂,具体产品都集中在一个类里面。
简单工厂模式的核心是工厂类,工厂类中存在判断逻辑,决定在某种情况下创建什么样的实例。
缺点就是对于工厂类过于依赖,增加新的具体产品时需要修改工厂类的实现逻辑。
public class HumanBuilder{
public static Human build(String sex){
if(sex.equalsIgnoreCase("male")){
return new ZhangSan();
}else if(sex.equalsIgnoreCase("female")){
return new Lisi();
}
}
}
系统中需要创造新的人类的地方可以使用:
HumanBuilder.build("male");
HumanBuilder.build("female");
工厂方法模式
工厂方法模式是简单工厂模式的抽象和推广。
FruitGardener是工厂方法模式的核心,但是FruitGardener不再负责生产具体的对象,而是由其子类去负责生产。
Class AppleGardener implements FruitGardener{
private AppleGardener(){}
private static AppleGardener gardener = null;
public synchronized static AppleGardener getInstance(){
if(gardener == null){
gardener = new AppleGardener();
}
return gardener;
}
public Fruit factory(){
return new Apple();
}
}
需要获取Apple对象时可以使用:
Fruit apple = AppleGardener.getInstance().factory();
工厂可以每次创建一个新的对象以供使用,也可以只创建一个对象,将对象加入到某个集合中。有获取对象的请求时,先去集合中查找有无合适的实例,有则直接返回,没有就创建并保存至集合,这就是享元模式。
抽象工厂模式
抽象工厂模式是工厂模式最为抽象和最具一般性的形态。
“开-闭”原则要求要求一个软件系统在不修改代码的前提下,通过扩展以达到增强功能的目的。
Class UnixFactory implements AbstractFactory{
private UnixFactory (){}
private static UnixFactory factory = null;
public synchronized static UnixFactory getInstance(){
if(factory == null){
factory = new UnixFactory ();
}
return factory;
}
public Button createButton{
return new UnixButton();
}
public Text createText{
return new UnixText();
}
}
需要获取UnixButton对象时可以使用:
Button button = UnixFactory .getInstance().createButton();
实际开发工作中利用XML做配置文件,再从XML文件中读取类的名称并实例化也可以看做工厂模式的变种。
<?xml version="1.0"?>
<Apple>
<Constructor Class ="com.AppleConstructor"/>
</Apple>
<Pear>
<Constructor Class ="com.PearConstructor"/>
</Pear>
ObjService 0bj = XMLFileParser.parse("text.xml");
String appleConstructor = 0bj.objectAt(0).getString('"Class");
Fruit apple = Class.forName(appleConstructor).newInstance().construct();