工厂模式

试问:
1.你知道设计模式吗?--当然。
2.告诉我一个商业案例并写下工厂方法的代码片段。--写下了一个简单工厂模式(非常不幸,简单工厂模式不被认为是设计模式)。
在本文,我不会展示如何编写Simple Factory和Factory Method ,相反我更愿意讨论它们是什么以及何时使用它们

如果你关于上面的两个问题的答案和上面的一样,要注意了:
1、实际上是在试图记住设计模式,而不是理解它试图解决的问题。
2、我们无法分析业务的问题并基于它们应用模式。相反,我们试图在业务案例中找到我们所知道的模式。


简单工厂模式

// 外卖接口
public interface Takeaway {
     String getTakeawayName();
}  
// 百度糯米 外卖
public class BaiDuNuomiTakeaway  implements Takeaway{
    @Override
    public String getTakeawayName() {
        return "百度糯米";
    }
}
// 美团  外卖
public class MeiTuanTakeaway  implements Takeaway{
    @Override
    public String getTakeawayName() {
        return "美团";
    }
}

// ** 工厂 **
 public class SimpleFactory {
    public static Takeaway createTakeaway(String type){
        switch (type){
            case "百度糯米": return new BaiDuNuomiTakeaway();
            case "美团": return new MeiTuanTakeaway();
            default: return null;
        }
    }
  public static void main(String[] args) {
        System.out.println(SimpleFactory.createTakeaway("百度糯米").getTakeawayName());
    }
}

使用Simple Factory ,调用者唯一知道的就是通过调用静态方法并传递所需要的参数,工厂就会返回一个外卖对象。但是如何创建外卖,客户端的代码并不知道。

改变是软件开发唯一不变的。比如我希望工厂在创建饿了么,当目前的工厂不能满足我时,毫无疑问,我需要创建饿了么的类,并在工厂中添加饿了么的创建过程。在小范围可能感觉不出来,但在更大的业务范围内,这会损害设计,接下来我们在开看看业务的简单变化,会如何影响设计。

工厂模式系列(工厂方法模式、抽象工厂模式)

除了Simple Factory之外,Factory Pattern系列的另外两个成员:Factory Method和Abstract Factory。我不在此详细介绍这两种模式了。
简而言之,Factory Method 使用实现接口,Abstract Factory 使用继承。Factory Method 是关于创建一种类型的对象,而Abstract Factory是关于创建一系列不同类型的对象。所有这三个都是通过设计原则封装对象创建:封装变化的东西。

如果业务需求不仅仅是产品创建,如果你想要控制产品创建步骤并希望控制每一个步骤,并且步骤是自定义的,那我们可以使用工厂方法模式,换句话说,如果要控制一些列产品的算法策略,可以考虑 工厂方法模式。
如果要创建一个框架,你希望从创建Object到管理该Object的控件,请使用工厂方法模式,这与简单工厂不同,简单工厂只关注产品创建后的结果,而不关心如何创建并管理产品。

回到我们的例子。现在,假设我们的业务要求不仅要创建外卖,还要根据当前外卖人员距离用户远近是否接受订单和发送外卖。
因此,我们需要创建一种算法,创建卖并发送它们,计算运输成本。工厂方法模式是理想的,我们在重新设计一下。

编码
// 抽象工厂  :生产不同种类的产品
public abstract class AbstractFactory {
    public abstract MeiTuanTakeaway createMeiTuanTakeaway();

    public abstract int shippingCharge();

    public final void orderTakeaway(){
        createMeiTuanTakeaway();
        int chagre=shippingCharge();
        System.out.println("运费:"+chagre);
    }

}

// 外卖 

public class Takeaway extends AbstractFactory {
    @Override
    public MeiTuanTakeaway createMeiTuanTakeaway() {
        return  new MeiTuanTakeaway();
    }

    @Override
    public int shippingCharge() {
        return 100;
    }

    public static void main(String[] args) {
        AbstractFactory  factory  =  new Takeaway();
        factory.orderTakeaway();
    }
}

理由:使用工厂方法模式,我们不仅可以抽象产品创建,还可以更进一步,我们可以抽象生产外卖的工厂。因此我们可以控制产品的创建和管理。上面的代码,你会发现,我们使用了抽象工厂,在抽象工厂中,我们创建了一个模板方法,来控制外卖的生命周期-创建外卖和运输成本计算,并可以使抽象工厂可以相应的改变他们。
优点:创建一个框架,控制产品生命周期。


总结:

简单工厂模式:根据调用者传入的参数,工厂动态决定所要创建的产品。只关心结果。
工厂方法模式:核心类成为一个抽象工厂角色,而实现类,只创建一种类型对象。
抽象工厂模式:创建一系列不同类型对象。


推荐阅读:

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

推荐阅读更多精彩内容

  • 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。通常我们所说的工厂模式是指工厂方法模...
    zfylin阅读 1,307评论 0 7
  • 一、工厂模式介绍 工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每...
    QuantRuu阅读 752评论 0 51
  • 工厂模式概述 意义 问题引出在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用...
    stoneyang94阅读 484评论 0 0
  • 一、工厂模式介绍 工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每...
    端木轩阅读 12,688评论 1 20
  • 今天下午,突然有种想看电影的冲动,网上一搜,发现评价最高的是《速度与激情8》,就决定前去观影。整个影片非常精彩,除...
    冰上之路阅读 643评论 4 4