设计模式——工厂模式

一、简单工厂模式

1、原理

创建一个工厂类,提供一个创建对象方法,根据传参判断返回哪一个产品,各种产品应属于同一类,实现或继承自同一个接口或抽象类。

2、UML类图

简单工厂

3、示例代码

public class SimplePizzaFactory {

    private static Pizza mPizza;

    public static Pizza createPizza(String type){
        switch (type){
            case "cheese":
                mPizza = new CheesePizza();
                break;
            case "greak":
                mPizza = new GreakPizza();
                break;
        }
        mPizza.make();
        return mPizza;
    }
}

4、特点

  • 外部调用相关方法,根据不同类别返回不同实例,外部调用者不需要去做区分,降低了客户端和创建过程中其他类的耦合,符合迪米特原则
  • 工厂类违反开闭原则,当系统需要拓展第三种口味的Pizza时,需要对工厂类做出修改,随着项目拓展,工厂类变得臃肿,不便于后期维护。

二、工厂方法模式

1、原理

因为简单工厂模式中违反了开闭原则,所以工厂方法模式中对工厂类进行抽象化,不同工厂子类生产对应的产品,当系统拓展的时候新增相应的产品工厂,不需要再去对已有的工厂类进行修改,使系统满足了开闭原则。

2、UML类图

工厂方法

3、示例代码

public class CheesePizzaFactory extends PizzaFactory{

    @Override
    protected Pizza createPizza() {
        CheesePizza pizza = new CheesePizza();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }
}
public class GreakPizzaFactory extends PizzaFactory{

    @Override
    protected Pizza createPizza() {
        GreakPizza pizza = new GreakPizza();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }
}

4、特点

  • 将简单工厂模式中工厂类抽象化,定义一个抽象工厂基类,工厂子类具体实现产品对象的创建细节,当有新的产品需要创建时,新建其对应的工厂类即可。
  • 每个工厂子类只能生产一种产品,当产品过多时,工厂类也会增多,且工厂类实现都差不多,系统复杂度也上升。

三、抽象工厂模式

1、原理

为解决工厂方法模式中一个工厂类只能生产一种产品导致的类数量增多,系统复杂度提升问题,抽象工厂模式是一个工厂类可以生产多种产品。

2、UML类图

抽象工厂

3、代码实例

public class BJPizzaFactory extends AbstractPizzaFactory{

    @Override
    protected AbstractPizza createCheesePizza() {
        BJCheesePizza cheesePizza = new BJCheesePizza();
        cheesePizza.bake();
        cheesePizza.cut();
        cheesePizza.box();
        return cheesePizza;
    }

    @Override
    protected AbstractPizza createGreakPizza() {
        BJGreakPizza cheesePizza = new BJGreakPizza();
        cheesePizza.bake();
        cheesePizza.cut();
        cheesePizza.box();
        return cheesePizza;
    }
}
public class SHPizzaFactory extends AbstractPizzaFactory{

    @Override
    protected AbstractPizza createCheesePizza() {
        SHCheesePizza cheesePizza = new SHCheesePizza();
        cheesePizza.bake();
        cheesePizza.cut();
        cheesePizza.box();
        return cheesePizza;
    }

    @Override
    protected AbstractPizza createGreakPizza() {
        SHGreakPizza cheesePizza = new SHGreakPizza();
        cheesePizza.bake();
        cheesePizza.cut();
        cheesePizza.box();
        return cheesePizza;
    }
}

4、特点

一个工厂子类可以生产多种同类商品,系统在工厂级别上能很好的拓展,新建工厂子类继承基类即可,但当在产品级别上需要拓展时,需要去更改整个系统,包括基类中定义相关的创建方法返回新的产品类型对象,此时来看,不符合开闭原则,所以当一个系统中产品比较稳定的时候用这种方法比较好。

总结

简单工厂模式->工厂方法模式->抽象工厂模式依次改进得到,为了解决简单工厂模式中工厂类违反开闭原则的问题,工厂方法模式抽象化工厂类,使得不同的产品由不同的工厂类生产,这样当系统需要拓展新的产品时新建相关的工厂类即可,但解决了开闭原则问题的同时又衍生出新的问题,工厂方法模式中每个工厂类只能生产一种产品,当系统中产品很多时,工厂类也相应增加,系统复杂度提升,为了解决这一问题,抽象工厂模式通过一个工厂类生产多种产品的模式去实现,这样要求在定义工厂基类时就需要定义好创建相关产品的方法,即工厂能生产哪些产品在一开始就定义好了,工厂子类只是去实现具体细节,这样导致了在工厂层面上能够很好拓展,在产品层面上还是违反了开闭原则,新的产品来临时,需要在基类中去定义创建产品的方法,从上到下整个系统都得修改,所以对产品层面的拓展不友好,一般当系统产品稳定的情况推荐使用抽象工厂模式。

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