内容抄自《设计模式》清华大学出版社,2011
模式动机:
在实际的软件开发过程中,有时需要创建一些来自于相同父类的类的实例,为此可以专门定义一个类来负责创建这些类的实例,这些被创建的实例具有共同的父类,在这种情况下,可以通过传入不同的参数从而获得不同的对象。
模式分析:
包含角色:
1、Factory工厂类 (核心)
2、Product抽象产品 (TV)
3、ConcreteProduct具体产品 (TclTv HaierTv)
栗子:
/** 简单工厂
* @author Administrator
*
*/
class SimpleFactoryModel {
//抽象产品类
static interface Product{
public void show();
}
static class Factory{
public Product create(String name){
if(name.equals("a")){
return ()->{System.out.println("我是产品A");};
}
else if(name.equals("b")){
return ()->{System.out.println("我是产品B");};
}
else{
return ()->{System.out.println("我是产品C");};
}
}
}
public static void main(String[] args) {
Factory factory = new Factory();
factory.create("a").show();
factory.create("b").show();
factory.create("c").show();
}
}
优点:
- 1.客户端可以免除直接创建产品对象的责任,而仅仅消费产品。
- 2.客户端无须知道所创建的具体产品类的类名,通过简单工厂模式可以减少使用者的记忆量。
- 3.可以通过配置更换和新增具体的产品类,在一定程度上提高了系统的灵活性。
缺点:
- 1.由于工厂类集中了所有的产品创建逻辑,一旦不能正常工作,整个系统都有受影响。
- 2.使用简单工厂模式将会增加系统中类的个数。
- 3.系统扩展困难,一旦添加新产品就不得不修改工厂逻辑。
适用环境:需要创建的对象比较少,不会造成工厂方法中的业务逻辑太复杂
扩展:在有些情况下,工厂类可以由抽象产品cosplay,一个抽象产品类同时也是子类的工厂