简单工厂模式
创建型模式
UML
代码实现
interface Product{
}
class ConcreteProduct1 implements Product{
public ConcreteProduct1{
System.out.println("ConcreteProduct1");
}
}
class ConcreteProduct2 implements Product{
public ConcreteProduct2{
System.out.println("ConcreteProduct2");
}
}
class Factory{
public static Product factory(String arg){
if(arg.equals("p1")){
return new ConcreteProduct1();
}else if(arg.equals("p2")){
return new ConcreteProduct2();
}else{
throw new RuntimeException("没有此产品");
}
}
}
测试
class Test{
public static void main(String args[]){
Product product1,product2;
product1 = Factory.factory("p1");
product2 = Factory.factory("p2");
}
}
综述
简单工厂模式对产品角色 开-闭 原则是成立的,而对于工厂角色 开-闭 原则是不成立的。简单工厂模式只在有限的程度上支持 开-闭原则。
简单工厂的要点是当用户需要什么时,只需要传入一个正确的参数,就可以获取所需要的对象,而无需知道其创造细节。
优点
工厂类包含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割。它提供了专门的工厂类用于创建对象。客户端无需知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式就可以减少用户的记忆量。新的产品加入系统时,产品角色无需修改就可被接纳。
缺点
系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。
适用场景
- 工厂类负责创建的对象比较少。因为创建的对象比较少,不会造成工厂方法中的业务逻辑太多复杂。
- 客户端只知道传入工厂类的参数,对于如何创建对象不关心。客户端既不关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。