美文网首页
设计模式——工厂方法模式

设计模式——工厂方法模式

作者: prik丶 | 来源:发表于2019-07-29 11:10 被阅读0次

《Head First 设计模式》 学习笔记,码云同步更新中

如有错误或不足之处,请一定指出,谢谢~

目录

查看其它设计模式笔记,点这里→设计模式笔记汇总

工厂方法模式(Factory Method Pattern)

  • 定义:
    • 工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。
      工厂方法让类把实例化推迟到子类。
  • 结构:
    • Factory:抽象工厂
    • ConcreteFactory:具体工厂
    • Product:抽象产品
    • ConcreteProduct:具体产品
  • 对比简单工厂:
    • 简单工厂将对象的创建逻辑写在工厂类里,那么当我们有新的对象加入时,就需要修改工厂类的代码。这不符合开闭原则。那如果我们定义一个抽象工厂类,然后将具体的对象创建过程交给子类去做,当我们引进新的产品时,只需要增加一个新的工厂类即可。显然这是要优于简单工厂模式的,这就是我们所说的工厂方法模式。
  • 优点:
    • 隐藏产品具体实现,用户只关心工厂,无需关心细节。
    • 有新产品加入时,无需修改其他工厂和产品,只需添加新的工厂和产品。扩展性良好,完全符合“开闭原则”。
    • 可结合配置文件实现对象实例化时的动态指定。
  • 缺点:
    • 会给系统带来更多的类,增加复杂度和额外开销。
  • 案例:
    • 先看上一节的简单工厂:顾客点单时,需要根据菜名创建出各种不同种类的披萨。 这些披萨都源自同一个披萨基类,不过各自有自己的口味实现。而我们创建具体的披萨对象时,只需要提供名字,不需要知道它们是如何创建的。这时就可以用到简单工厂,传递一个参数给工厂类,返回一个相应的披萨对象。
    • 这时我们披萨店要扩张了,但在各个省可能会有不同的制作方法。我们希望披萨在披萨口味上加盟店有自己的决定权。但在制作流程上要受到总店的控制,比如必须使用我们品牌的盒子来装披萨等等。
  • 代码:
/**
 * 披萨店超类
 **/
public abstract class PizzaStore {

    public Pizza orderPizza(String type) {

        // 把创建披萨方法从简单工厂拿回来
        Pizza pizza = createPizza(type);

        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();

        return pizza;
    }

    /**
     * 将实例化披萨的责任移到抽象方法中,这个方法就等同于一个工厂
     * 子类通过这个方法来执行对象实例化逻辑,达到超类和子类解耦的目的
     */
    abstract Pizza createPizza(String type);

}

/**
 * 上海加盟店
 **/
public class SHPizzaStore extends PizzaStore {
    @Override
    protected Pizza createPizza(String type) {
        if (type.equals("cheese")) {
            return new SHCheesePizza();
        } else if (type.equals("veggie")) {
            return new SHVeggiePizza();
        }
        return null;
    }
}

// 其他加盟店略

/**
 * 披萨超类
 **/
public interface Pizza {
    /**
     * 准备
     */
    void prepare();

    /**
     * 烘焙
     */
    void bake();

    /**
     * 切片
     */
    void cut();

    /**
     * 装盒
     */
    void box();
}

/**
 * 上海芝士披萨
 **/
public class SHCheesePizza implements Pizza{

    @Override
    public void prepare() {
    }

    @Override
    public void bake() {
    }

    @Override
    public void cut() {
    }

    @Override
    public void box() {
        System.out.println("上海风味芝士披萨完成...");
    }
}

// 其他种类披萨略

/**
 * 测试类
 **/
public class Test {
    public static void main(String[] args) {
        // 首先需要一个上海披萨店
        SHPizzaStore shPizzaStore = new SHPizzaStore();
        // 然后点单
        Pizza pizza = shPizzaStore.orderPizza("cheese");
    }
}

结果:
    上海风味芝士披萨完成...

相关文章

  • 2021-11-16 - 学习记录

    设计模式学习:创建型:工厂(工厂方法,抽象工厂),建造者,单例,原型 设计模式:工厂模式 简单工厂 工厂方法 抽象工厂

  • 工厂模式

    工厂模式 就是工厂---生产-->产品 在设计模式中,分为 简单工厂模式, 工厂方法模式,抽象工厂模式. 工厂模式...

  • PHP-浅谈单例模式和工厂模式

    PHP中常用的设计模式有单例模式、工厂模式(简单工厂模式、工厂方法模式和抽象工厂方法模式)、适配模式、策略模式。 ...

  • 设计模式-工厂模式

    设计模式1 设计模式2 工厂模式 工厂模式可简单的分为三类:简单工厂,工厂方法,抽象工厂 简单工厂模式 定义 简单...

  • 设计模式之工厂方法模式(创建型)

    一、模式定义 工厂方法模式:又称工厂模式,也叫虚拟构造器模式,属于构建型设计模式,工厂方法模式是在简单工厂模式上进...

  • spring 设计模式篇(前)

    设计模式俗称:套路 一、spring常见设计模式 (23种设计模式) 创建型:工厂方法模式、抽象工厂模式、建造者...

  • 设计模式系列-简单工厂模式

    JAVA设计模式系列: 单例模式 观察者模式 模板方法模式 简单工厂模式 定义 简单工厂模式又叫做静态工厂方法模式...

  • 简单工厂模式

    Android进阶之设计模式 简单工厂模式 简单工厂模式(又叫作静态工厂方法模式), 其属于创建型设计模式,但并不...

  • 设计模式之简单工厂、工厂方法、抽象工厂

    设计模式之简单工厂、工厂方法、抽象工厂 什么是设计模式? 设计模式(Design pattern)代表了最佳的实践...

  • 设计模式(六)抽象工厂模式

    导读:前文设计模式(五)工厂方法模式介绍了工厂方法模式,本篇开始介绍抽象工厂模式,继续优化工厂方法模式,更好的满足...

网友评论

      本文标题:设计模式——工厂方法模式

      本文链接:https://www.haomeiwen.com/subject/fvgvrctx.html