设计模式(五):《Head First设计模式》工厂模式

前言

接上篇设计模式(四):《Head First设计模式》工厂模式之简单工厂

概念

工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类

抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类

工厂方法

abstract Product factoryMethod(String type)
  • 工厂方法是抽象的,所以依赖子类来处理对象的创建
  • 必须返回一个产品,比如煎饼果子工厂必须返回煎饼果子
  • 参数不是必需的,根据需求来定

煎饼果子干大了

煎饼果子产业逐步扩大,煎饼果子研究室也持续出新品,并且出现地区风味了,但是煎饼的制作工艺和核心配方是一样的。

鉴于上述情况,总工厂负责生产,加盟店负责销售的模式不再适用。

Demo

以下只实现了临沂风味店,菜煎饼店同理~

煎饼果子总店

public abstract class JBGZStore {

    public Jianbingguozi orderJBGZ(String type) {
        Jianbingguozi jbgz;
        jbgz = createJBGZ(type);
        jbgz.prepare();
        jbgz.make();
        jbgz.cut();
        return jbgz;
    }
    
    // 工厂方法,由子类负责实现
    abstract Jianbingguozi createJBGZ(String type);
}

依照总店打造的分店(临沂风味煎饼果子总代理)

public class LinyiStore extends JBGZStore{

    @Override
    Jianbingguozi createJBGZ(String type) {
        Jianbingguozi jianbingguozi = null;
        if("乞丐版".equals(type)) {
            jianbingguozi = new LYQigaibanJBGZ();
        }else if("高配版".equals(type)) {
            jianbingguozi = new LYGaopeibanJBGZ();
        }else if("豪华版".equals(type)) {
            jianbingguozi = new LYHaohuabanJBGZ();
        }
        return jianbingguozi;
    }
}

产品-煎饼果子抽象类

public abstract class Jianbingguozi {

    String name;
    // 加什么
    ArrayList<String> adders = new ArrayList<>(8);
    
    void prepare() {
        printf("开始准备制作" + name + "……");
        for(int i = 0; i < adders.size();i++) {
            printf("放 " + adders.get(i));
        }
    }
    
    // 正常的煎饼果子制作是一样的
    void make() {
        printf("制作煎饼");
    }
    
    // 是否需要拦腰切断
    void cut() {
        printf("不需要切开");
    }
    
    private void printf(String str) {
        System.out.println(str);
    }
}

产品实现--临沂风味丐版煎饼果子

public class LYQigaibanJBGZ extends Jianbingguozi{

    public LYQigaibanJBGZ() {
        name = "临沂风味丐版煎饼果子";
        adders.add("鸡蛋");
        adders.add("果子");
    }
}

产品实现--临沂风味高配版煎饼果子

public class LYGaopeibanJBGZ extends Jianbingguozi{

    public LYGaopeibanJBGZ() {
        name = "临沂风味高配版煎饼果子";
        adders.add("两个鸡蛋");
        adders.add("果子");
        adders.add("火腿肠");
    }
}

产品实现--临沂风味豪华版版煎饼果子

public class LYHaohuabanJBGZ extends Jianbingguozi{

    public LYHaohuabanJBGZ() {
        name = "临沂风味豪华版煎饼果子";
        adders.add("两个鸡蛋");
        adders.add("果子");
        adders.add("火腿肠");
        adders.add("鸡柳");
        adders.add("培根");
        adders.add("生菜");
    }
}

测试

public class JBGZTestDriver {

    public static void main(String[] args) {
        JBGZStore lyStore = new LinyiStore();
        Jianbingguozi lyjbgz = lyStore.createJBGZ("豪华版");
        System.out.println("土豪顾客点了个 " + lyjbgz.name);
    }
}    

Demo解析

跟上一篇文章的区别在于,我们将煎饼果子的制作权利下放到了产品的具体制作商那里了,而不是控制在总工厂,这里用的就是工厂方法模式

定义了一个创建对象的接口JBGZStore,但是由具体的煎饼果子商店决定要实例化哪个产品

abstract Jianbingguozi createJBGZ(String type);

上面的代码就是工厂方法,是一个抽象方法,具体实现由子类负责。这样就将实例化推迟到了子类当中。

书中是利用Pizza制作解析的,图示如下

图片来自《Head First 设计模式》

工厂方法模式与抽象工厂模式

  • 抽象工厂是创建一个产品家族,而工厂方法创建一个产品

  • 创建对象的方法不同

    • 工厂方法使用继承。利用工厂方法创建对象,需要扩展一个类,并覆盖它的工厂方法
    • 抽象工厂通过对象的组合。抽象工厂提供一个用来创建一个产品家族的抽象类型。这个类型的子类定义了产品被产生的方法。”把一群相关的产品集合起来“

    借用下书中的Pizza原料工厂例子,如下

    1. 定义抽象接口用来创建产品家族(原料):Interface PizzaIngredientFactory

    2. 两个子类(抽象工厂):纽约原料工厂,芝加哥原料工厂
      这两个子类负责原料生产,通常是通过工厂方法来实现的

    3. 所有的原料都是属于产品,正如上述工厂方法中的煎饼果子这个产品

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • 前言 本文是对工厂模式中的简单工厂的学习笔记,如有错误请指正~ 简单工厂不是设计模式,更像是一种编程习惯,是学习工...
    LY丶Smile阅读 275评论 0 0
  • 除了使用new操作符之外,还有更多制造对象的方法。你讲了解到实例化这个活动不应该总是公开的进行,也会认识到初始化经...
    pilipalaKing阅读 368评论 0 0
  • 设计原则: 要依赖抽象,不要依赖具体类 目录 本文的结构如下: 什么是抽象工厂模式 为什么要用该模式 模式的结构 ...
    w1992wishes阅读 1,105评论 0 6
  • 午夜不是最后一班列车, 窗外行人走过你, 于城市的最后一片喧嚣缓缓前行。 窗内的人在看桥上的人, 灯和行人是一道风...
    七月上的冥王星阅读 139评论 0 1
  • 临近年底,简单做下总结。 回想这一年,工作上发生了很多事。跌跌撞撞一路总算走过来了。虽然速度很慢,但好在方向没错。...
    代帅阅读 247评论 0 0