1.简单工厂模式
1.1含义
- 简单工厂模式又叫静态方法模式(因为工厂类定义了一个静态方法)
- 现实生活中,工厂是负责生产产品的;同样在设计模式中,简单工厂模式我们可以理解为负责生产对象的一个类,称为“工厂类”。
1.2模式组成
1.3使用步骤
- 创建抽象产品类 (具体产品类的父类)& 定义具体产品的公共接口;
- 创建具体产品类(继承抽象产品类) & 定义生产的具体产品;
- 创建工厂类,通过创建静态方法根据传入不同参数从而创建不同具体产品类的实例;
- 外界通过调用工厂类的静态方法,传入不同参数从而创建不同具体产品类的实例
1.4实例介绍
现有一个加工水果的工厂,需要加工3种水果(apple、pear、orange),运用简单工厂模式实现。
步骤1:创建抽象产品类,定义具体产品的公共接口。
abstract class Product{ public abstract void Show(); }
步骤2. 创建具体产品类(继承抽象产品类),定义生产的具体产品。
//具体产品类A class ProductA extends Product{ @Override public void Show() { System.out.println("加工了apple"); } } //具体产品类B class ProductB extends Product{ @Override public void Show() { System.out.println("加工了pear"); } } //具体产品类C class ProductC extends Product{ @Override public void Show() { System.out.println("加工了orange"); } }
步骤3. 创建工厂类,通过创建静态方法从而根据传入不同参数创建不同具体产品类的实例。
class Factory { public static Product Manufacture(String ProductName){ //工厂类里用switch语句控制生产哪种商品; //使用者只需要调用工厂类的静态方法就可以实现产品类的实例化。 switch (ProductName){ case "A": return new ProductA(); case "B": return new ProductB(); case "C": return new ProductC(); default: return null; } } }
步骤4. 外界通过调用工厂类的静态方法,传入不同参数从而创建不同具体产品类的实例。
//工厂加工水果流程 public class SimpleFactoryPattern { public static void main(String[] args){ Factory mFactory = new Factory(); //客户要求加工apple try { //调用工厂类的静态方法 & 传入不同参数从而创建产品实例 mFactory.Manufacture("A").Show(); }catch (NullPointerException e){ System.out.println("这个工厂不能加工这个水果"); } //客户要求加工pear try { mFactory.Manufacture("B").Show(); }catch (NullPointerException e){ System.out.println("这个工厂不能加工这个水果"); } //客户要求加工orange try { mFactory.Manufacture("C").Show(); }catch (NullPointerException e){ System.out.println("这个工厂不能加工这个水果"); } //客户要求加工banana try { mFactory.Manufacture("D").Show(); }catch (NullPointerException e){ System.out.println("这个工厂不能加工这个水果"); } } }
相对于我现在想要加工一下苹果,按照原来的想法是直接new一个加工苹果的工厂出来,而现在有了已经有了一个总工厂(可以加工3种水果),我可以直接去这个工厂说出我的需求,让他来帮我加工水果,我们才不管他是如何实现加工我的水果的,我只是把我的需求扔给他,剩下的交给他来完成就可以了。总之,简单工厂就是把之前我们需要亲力亲为的事情改变了,我们现在直接面向一个工厂,让他来帮我们完成事情。(其实三种工厂设计模式都是这种思路,只不过各有优缺点)
1.5简单工厂模式优点
- 将创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建,实现了解耦;
- 把初始化实例时的工作放到工厂里进行,使代码更容易维护。 更符合面向对象的原则 & 面向接口编程,而不是面向实现编程。
1.6简单工厂模式缺点
- 工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响;
- 不符合“开闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂。
- 简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构。
1.7简单工厂模式应用场景
- 客户如果只知道传入工厂类的参数,对于如何创建对象的逻辑不关心时;(如我只知道要加工苹果,即参数就为A)
- 当工厂类负责创建的对象(具体产品)比较少时。