简单工厂模式(Simple Factory)
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。(自百度百科)
简单工厂模式的UML图
可以看到,简单工厂模式一共有三个角色:
工厂角色:简单工厂角色的核心,包含所有产品的创建逻辑。具体为,获取外部传递的需要创建的产品的信息,从而生产具体的产品,具体生产什么产品,取决于你想生产什么产品,工厂做的只是接收信息,生产具体能够生产的产品就好了。
抽象产品角色:所有产品的父类,描述所有产品的共有特征。
具体产品角色:具体要生产的产品,继承抽象产品,有自己特有的特征,简单工厂的创建目标。
简单工厂模式代码实现(以生产手机为例)
抽象产品类
public abstract class Cellphone { public abstract void phone(); }
具体产品
//oppo public class Oppo extends Cellphone{ @Override public void phone() { System.out.println("oppo手机"); } }
//华为 public class Huawei extends Cellphone{ @Override public void phone() { System.out.println("华为手机"); } }
//vivo public class Vivo extends Cellphone { @Override public void phone() { System.out.println("vivo手机"); } }
工厂类
public class CellphoneFactory { public static Cellphone makePhone(String cellphoneName){ Cellphone cellphone = null; switch (cellphoneName) { case "vivo": cellphone = new Vivo(); break; case "oppo": cellphone = new Oppo(); break; case "huawei": cellphone = new Huawei(); break; default: break; } return cellphone; } }
客户端调用及结果
public class Client { public static void main(String[] args) { Cellphone cellphone1 = CellphoneFactory.makePhone("huawei"); cellphone1.phone(); Cellphone cellphone2 = CellphoneFactory.makePhone("vivo"); cellphone2.phone(); Cellphone cellphone3 = CellphoneFactory.makePhone("oppo"); cellphone3.phone(); } }
简单工厂模式的优缺点分析
优点:工厂类中包含了生产具体产品的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。也就是说,不需要知道具体产品生产的原理,如手机的制作流程,只需要知道自己想要哪种手机,剩下的交给工厂就好了,手机怎么生产出来的,是哪个具体的手机,均与客户端无关,反正它都是手机。
缺点:由于工厂类中包含了所有的产品创建逻辑,一旦这个工厂出现问题不能工作了,那么所有客户端都会受到影响。并且,如果要增加新的产品生产线,不但要增加新的产品实现类,还需要在工厂类中增加产品生产的逻辑判断,这也就意味着对修改开放了,违背了“开放-封闭原则”——对扩展开放,对修改封闭。