大白话工厂方法模式(Factory Method)

目录
  • 简单工厂模式缺陷

  • 简单工厂模式改造

  • 工厂方法模式定义

  • 工厂方法模式结构

  • 工厂方法模式分析

    • 优点分析

    • 缺点分析

  • 参考文献

简单工厂模式缺陷

大白话简单工厂模式(Simple Factory Pattern)中通过买车的经历解释了简单工厂模式。但熟悉设计模式的朋友会发现一些问题。

  • 工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响。用日产车工厂的例子来形容就是日产汽车的工厂负责所有车型的制造,当发生停电、火灾等情况时,汽车无法正常制造,大大影响汽车的销售,使企业陷入困境

  • 违背“开放 - 关闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂。这句话的意思是当企业发布新产品,该工厂需要重新学习新车型的制造,加大工人压力。

所以,随着企业的发展,日产公司决定将每种车型进行分工厂制造,解决了上述问题。这种方法在设计模式中被称为工厂方法模式

简单工厂模式改造

下面我们从代码的角度进行分析。4S店卖车首先要有车,这里只取日产部分车型逍客,轩逸和天籁。
代码片段1 日产车父类,所有车型都继承此类。

/**
 * 日产车
 * @author coderzcr
 */
abstract class NissanCar {
    String name;
    void printCar(){
        System.out.println(name+"汽车已制造完成");
    }
}

代码片段2 车型:逍客

/**
 * 车型:逍客
 * @author coderzcr
 */
class Xtrail extends NissanCar {
    Xtrail(){
        this.name = "逍客";
    }
}

代码片段3 车型:轩逸

/**
 * 车型:轩逸
 * @author coderzcr
 */
class Sylphy extends NissanCar {
    Sylphy(){
        this.name = "轩逸";
    }
}

代码片段4 车型:天籁

/**
 * 车型:天籁
 * @author coderzcr
 */
class Altima extends NissanCar {
    Altima(){
        this.name="天籁";
    }
}

有了具体的车型要求,我们需要对不同车型建立工厂。
代码片段5 日产工厂父类,所有工厂都继承此类。

/**
 * 日产车工厂
 * @author coderzcr
 */
public abstract class NissanCarFactory {
    /**
     * 生产汽车
     */
    abstract NissanCar createCar() ;

}

代码片段6 天籁工厂。

/**
 * 天籁工厂
 * @author coderzcr
 */
public class AltimaFactory extends NissanCarFactory {
    @Override
    NissanCar createCar() {
        return new Altima();
    }
}

代码片段7 逍客工厂。

/**
 * 逍客工厂
 * @author coderzcr
 */
public class XtrailFactory extends NissanCarFactory {
    @Override
    NissanCar createCar() {
        return new Xtrail();
    }
}

代码片段8 轩逸工厂。

/**
 * 轩逸工厂
 * @author coderzcr
 */
public class SylphyFactory extends NissanCarFactory {
    @Override
    NissanCar createCar() {
        return new Sylphy();
    }
}

图1 多工厂类图

工厂方法模式定义

工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。

工厂父类(日产车工厂)
工厂子类(轩逸工厂、天籁工厂、逍客工厂)
即产品的制造分配给子工厂,缓解单一工厂的压力。

工厂方法模式结构

图2 工厂方法模式结构

工厂方法模式包含如下角色:

  • Product:抽象产品

  • ConcreteProduct:具体产品

  • Factory:抽象工厂

  • ConcreteFactory:具体工厂

工厂方法模式分析

优点分析

  • 工厂方法模式的优点包括简单工厂方法模式的优点:用户只需要关心所需产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。

  • 而且解决了简单工厂存在的不符合开闭原则问题,
    在系统中加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品就可以了。这样,系统的可扩展性也就变得非常好,完全符合“开闭原则”。

缺点分析

添加新产品时,需要添加一个具体工厂和具体产品,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来一些额外的开销。

参考文献

2. 工厂方法模式(Factory Method Pattern) — Graphic Design Patterns

(0)

相关推荐

  • 创建型模式

    title: "[设计模式]创建型模式" date: 2016-03-07 18:05 tags: 设计模式 design pattern creational factory m ...

  • 大白话简单工厂模式 (Simple Factory Pattern)

    从买车经历说起 毕业两年,码农张小两口无法忍受挤公交,凌晨起床抢火车票的痛苦,遂计划买车.逛了多家4S店,最终定下日产某车型的轿车.4S店接受订单后,向工厂说明车型,工厂随后进行汽车制造,运输到4S店 ...

  • 3分钟瞬间记住10个英文单词,探索单词【factory工厂】的由来?

    3分钟瞬间记住10个英文单词,探索单词【factory工厂】的由来?

  • 设计模式(1) 工厂方法模式

    创建型模式 简单工厂模式 工厂方法模式 IOC与工厂方法模式的结合 泛型工厂 委托工厂 创建型模式 创建型模式可以隔离客户程序对需要实例化类型的依赖关系,这类模式一般通过将实例化具体对象的职责委托给第 ...

  • PHP设计模式之享元模式

    PHP设计模式之享元模式 享元模式,"享元"这两个字在中文里其实并没有什么特殊的意思,所以我们要把它拆分来看."享"就是共享,"元"就是元素 ...

  • 设计模式----------工厂(Factory)模式

    作用 实现了创建者和调用者分离. 工厂模式核心/本质: 实例化对象不在使用new,而是用工厂方法代替. 将选择实现类,创建对象统一管理和控制,从而实现调用者和我们实现类解耦 工厂模式详细分类 1.简单 ...

  • PHP设计模式之简单工厂模式

    PHP设计模式之简单工厂模式 先从简单工厂入门,不管是面试还是被他人面试,在问到设计模式的时候,大多数人都会提到工厂模式.毫无疑问,工厂相关的几种模式在设计模式中是最出名的也是应用比较广泛的一种模式. ...

  • 【C++设计模式二】C++工厂模式

    (1)定义 简单工厂模式中,每新增一个具体产品,就需要修改工厂类内部的判断逻辑.为了不修改工厂类,遵循开闭原则,工厂方法模式中不再使用工厂类统一创建所有的具体产品,而是针对不同的产品设计了不同的工厂, ...

  • 【7/25】使用工厂方法模式(Factory Method Pattern)创建Page页面对象

    这是<小游戏从0到1设计模式重构>系列内容第7篇,所有源码及资料在"程序员LIYI"公号回复"小游戏从0到1"获取. 看完三姐妹中的简单工厂模式,再 ...

  • 【设计模式】工厂方法模式(Factory Method)

    工厂方法模式(Factory Method) 工厂方法模式分为三种: 1.普通工厂模式 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建.首先看下关系图:举例如下:(我们举一个发送邮件和短信 ...

  • 设计模式 | 工厂方法模式(factory method)

    定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 结构:(书中图,侵删) 一个工厂的抽象接口 若干个具体的工厂类 一个需要创建对象的抽象接口 若干个 ...

  • PHP设计模式之工厂方法模式

    PHP设计模式之工厂方法模式 上回说到,简单工厂不属于GoF的二十三种设计模式,这回可就来真家伙了,大名顶顶的工厂方法模式前来报道! GoF类图解释 工厂方法模式对比简单工厂来说,最核心的一点,其实就 ...

  • [PHP小课堂]PHP设计模式之工厂方法模式

    [PHP小课堂]PHP设计模式之工厂方法模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • FactoryMethodPattern工厂方法模式

    工厂方法模式 1.定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 基本工厂方法模式 抽象产品类 public abstract class Abst ...

  • 【设计模式】工厂方法模式

    定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类 优缺点 优点 针对简单工厂不容易扩展,工厂方法将实例化延迟到子类工厂,从而提供扩展 缺点 每次新增产品 ...

  • 大话设计模式笔记(六)の工厂方法模式

    栗子回顾 简单工厂模式: https://www.cnblogs.com/call-me-devil/p/10926633.html 运算类使用工厂方法模式实现 UML图 代码实现 工厂接口 /** ...