天天看点

设计模式总结之Factory Method Pattern(工厂方法模式)目录 Simple Factory Pattern(简单工厂模式)Factory Method Pattern(工厂方法模式)

目录

  • 设计模式分类

创建型设计模式:

  • Singleton Pattern(单例模式)   
  • Prototype Pattern(原型模式)
  • Factory Method Pattern(工厂方法模式)   
  • Abstract Factory Pattern(抽象工厂模式)
  • Builder Pattern(建造者模式)

结构型设计模式:

  • Adapter Pattern(适配器模式)   
  • Bridge Pattern(桥接模式)
  • Composite Pattern(组合模式)
  • Decorator Pattern(装饰者模式)
  • Façade Pattern(外观模式)
  • Flyweight Pattern(享元模式)
  • Proxy Pattern(代理模式)   

行为型设计模式:

  • Chain of Responsibility Pattern(职责链模式)
  • Command Pattern(命令模式)
  • Interpreter Pattern(解释器模式)   
  • Iterator Pattern(迭代器模式)
  • Mediator Pattern(中介者模式)
  • Memento Pattern(备忘录模式)
  • Observer Pattern(观察者模式)
  • State Pattern(状态模式)
  • Strategy Pattern(策略模式)
  • Template Method Pattern(模板方法模式)
  • Visitor Pattern(访问者模式)

Simple Factory Pattern(简单工厂模式)

GoF中认为简单工厂模式是工厂方法的一个特例。

结构

设计模式总结之Factory Method Pattern(工厂方法模式)目录 Simple Factory Pattern(简单工厂模式)Factory Method Pattern(工厂方法模式)

例子

设计模式总结之Factory Method Pattern(工厂方法模式)目录 Simple Factory Pattern(简单工厂模式)Factory Method Pattern(工厂方法模式)

优缺点

 优点:

优点:

简单,结合单例模式更加方便和节省资源。

 缺点:

增加新的产品时,需要修改工厂类的if…else逻辑,不符合开闭原则。

Factory Method Pattern(工厂方法模式)

意图

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。

适用性

• 当一个类不知道它所必须创建的对象的类的时候。

• 当一个类希望由它的子类来指定它所创建的对象的时候。

• 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

结构

设计模式总结之Factory Method Pattern(工厂方法模式)目录 Simple Factory Pattern(简单工厂模式)Factory Method Pattern(工厂方法模式)

参与者:

• Product(抽象产品) 

— 定义工厂方法所创建的对象的接口。 

• ConcreteProduct(具体产品) 

— 实现Product接口。

• Creator(抽象工厂类) 

— 声明工厂方法,该方法返回一个 Product类型的对象。 Creator也可以定义一个工厂方 法的缺省实现,它返回一个缺省的 ConcreteProduct对象。 

— 可以调用工厂方法以创建一个 Product对象。 

• ConcreteCreator(具体工厂类) 

— 重定义工厂方法以返回一个 ConcreteProduct实例。 

例子

设计模式总结之Factory Method Pattern(工厂方法模式)目录 Simple Factory Pattern(简单工厂模式)Factory Method Pattern(工厂方法模式)

优缺点

 优点:

首先,良好的封装性,代码结构清晰。一个对象创建是有条件约束的,如一个调用者需要一个具体的产品对象,只要知道这个产品的类名(或约束字符串)就可以了,不用知道创建对象的艰辛过程,降低模块间的耦合。

工厂方法模式是典型的解耦框架。高层模块只需要知道产品的抽象类,其他的实现类都不用关心,符合迪米特法则,我不需要的就不要去交流;也符合依赖倒置原则,只依赖产品类的抽象;当然也符合里氏替换原则,使用产品子类替换产品父类,没问题!

继续阅读