设计模式:工厂模式

发布时间:2021-10-04 22:02:56 阅读:(189)

    工厂模式

    什么是简单工厂模式

    专门定义一个类来负责创建其他类地实例,根据参数的不同创建不同类的实例,被创建的实例通常具有共同的父类,这个模式叫简单工厂模式。

    简单工厂模式又称为静态工厂方法模式。之所以成为静态,许多语言中方法通常被定义为一个静态方法,方便通过类名直接调用

    工厂三姐妹

    简单工厂模式
    工厂方法模式
    抽象工厂模式

    简单工厂模式

    最简单的版本,只有一个工厂类,类中有一个静态的创建方法,该方法根据参数传递过来的类型值或名称来创建具体的产品对象

    定义

    定义一个创建对象的接口,通过参数来决定创建哪个类的实例

    优缺点

    优点:

    • 实现简单,结构清晰
    • 抽象出一个专门的类来负责某类对象的创建,分割出创建的职责,不能直接创建具体的对象,只需传入适当的参数即可
    • 使用者可以不关注具体对象的类名称,只需知道传入什么参数可以创建哪些需要的对象

    缺点:

    • 不易扩展,一旦添加新的产品类型,就不得不修改工厂的创建逻辑。不符合“开放封闭”原则,如果要增加或删除一个产品类型,就要修改 swith case huo if else 的判断代码。(有替代方案,可以利用灵活的数组键值索引来解决这个问题)
    • 当产品类型较多时,工厂的创建逻辑可能过于复杂,判断会变得很多,一旦出错可能导致所有产品创建失败,不利于系统维护
    应用场景
    • 产品具有明显的继承关系,且产品类型不多
    • 所有产品具有相同的方法和类似的属性,使用者不关心具体的类型,只希望传入合适的参数能返回合适的对象

    工厂方法模式

    简单工厂模式的升级版本,为解决简单工厂模式不符合“开放 - 封闭”原则的问题,在简单工厂的上层抽象出一个父类工厂,将原本的简单工厂拆分成多个子类工厂,由对各子类工厂分别负责创建不同的产品

    定义

    定义一个创建对象的接口,让子类来决定创建哪个类的实例。工厂方法使一个类的实例化延迟到其子类

    优缺点

    优点:

    • 解决了简单工厂不符合“开放-封闭”原则的问题,使程序更容易扩展
    • 实现简单

    缺点:
    对于有多种分类的产品,或具有二级分类的产品,工厂方法模式并不适用

    应用场景
    • 客户端不知道它所需要的对象的类
    • 工厂类希望通过其子类来决定创建哪个具体类的对象

    抽象工厂模式

    抽象工厂模式是为解决工厂方法模式不能解决二级分类产品问题的升级版本

    定义

    提供一个创建一系列相关或相互依赖的对象的接口,而无须指定它们的具体类

    设计要点

    抽象工厂模式适用于有多个系列且每个系列有相同子分类的产品。
    我们定义一个抽象的工厂类AbstractFactory,AbstractFactory中定义生产每个系列产品的方法;而两个具体的工厂实现类Factory1和Factory2分别生产子分类1的每一系列产品和子分类2的每一系列产品。

    优缺点

    优点:
    解决了具有二级分类产品的创建
    缺点:

    • 如果产品的分类超过二级,抽象工厂模式将会非常臃肿
    • 不能解决产品多分类,多种组合的问题
    应用场景
    • 系统中有多于一个的产品族,而每次只使用其中某一产品族
    • 产品等级结构稳定,设计完成之后,不会向系统中增加新的产品等级结构或者删除已有的产品等级结构

    如果出现三级或更多分类怎么办

    超过三级包括三级以上分类,工厂类变得非常臃肿而难以维护,开发成本会急剧增加
    模式是死的,人是活的,不要为了使用设计模式而使用设计模式