工厂模式

一、解决了什么问题?

可批量生产、达到标注化。解决用户和产品之间的关系。
对于调用者来说不关心产生的具体逻辑,只关心结果;而对于工厂来说,保证我们产生出来的结果是符合国际化标准的。
工厂模式:只对结果负责,确保产品的标准化。

二、工厂模式演变过程,及代码实现demo

image

三、源-简单工厂

Car.java


package com.demo.gc;

/**

* @description: 定义标准(类)

*/

public interface Car {

  /**

   * 获取一个标准的产品

   * @return

   */

    String getCarName();

}

BmCar.java


package com.demo.gc;

/**

* @description:

*/

public class BmCar implements Car {

    @Override

    public StringgetCarName() {

        return "宝马";

    }

}

BcCar .java


package com.demo.gc;

/**

* @description:

*/

public class BcCar implements Car {

    @Override

    public StringgetCarName() {

        return "奔驰";

    }

}

SimpleFactory.java


package com.demo.gc.simple;

import com.demo.gc.BcCar;

import com.demo.gc.BmCar;

/**

* @description:

*/

public class SimpleFactory {

    public  String getCarName(String type){
        if("BC".equals(type)){
            return new BcCar().getCarName();

        }else if("BM".equals(type)){
            return new BmCar().getCarName();

        }else {
            return "未找到该汽车生成的工厂,无法产出该汽车";

        }

    }
}

Test.java


package com.demo.gc.simple;

/**

* @description: 简单工厂模式

*/

public class Test {

   public static void main(String[] args) {

          //用户本身不关心生产的过程,而只需要关心最后的结果

          //得到一个工厂

          SimpleFactory simpleFactory=new SimpleFactory();

          System.out.println(simpleFactory.getCarName("BC"));

          System.out.println(simpleFactory.getCarName("BM"));

          System.out.println(simpleFactory.getCarName("DC"));

    }

}

总结一:

  1. 优点
    • 通过一个含参的工厂方法,我们可以实例化任何产品类;
  2. 缺点
    • 当我们的子类比较多的情况下,SimpleFactory里面的代码会非常的多;
    • 遵循开闭原则的情况下,不能扩展(简直难受);

四、针对简单工厂的缺点---工厂模式

Factory.java

package com.demo.gc.func;

import com.demo.gc.Car;

/**
 * @description: 工厂方法模式
 */
public interface Factory {

    //工厂必定会有一个生产的功能
    Car getCarName();

}

BcCarFactory.java

package com.demo.gc.func;

import com.demo.gc.BcCar;
import com.demo.gc.Car;

/**
 * @description:
 */
public class BcCarFactory implements Factory {

    @Override
    public Car getCarName() {
        return new BcCar();
    }
}

BmCarFactory.java

package com.demo.gc.func;

import com.demo.gc.BmCar;
import com.demo.gc.Car;

/**
 * @description:
 */
public class BmCarFactory implements Factory {

    @Override
    public Car getCarName() {
        return new BmCar();
    }

}

Test.java

package com.demo.gc.func;

/**
 * @description: 工厂模式
 */
public class Test {

    public static void main(String[] args) {

        Factory factory=new BmCarFactory();
        System.out.println(factory.getCarName().getCarName());
    }
}

总结二:

  1. 优点
    • 工厂方法模式减轻了工厂类的负担;
    • 方便扩展,使工厂类遵循开放-开闭原则;
  2. 缺点
    • 相比简单工厂,实现稍微复杂点,处理起来也复杂了很多;

五、针对抽象方法模式缺点---抽象工厂模式

CarFactory.java

package com.demo.gc.abstr;

import com.demo.gc.BcCar;
import com.demo.gc.BmCar;
import com.demo.gc.Car;

/**
 * @description:
 */
public class CarFactory extends AbstractFactory {

    @Override
    public Car getBmCar() {
        return new BmCar();
    }

    @Override
    public Car getBcCar() {
        return new BcCar();
    }
}

AbstractFactory.java

package com.demo.gc.abstr;

import com.demo.gc.Car;

/**
 * @description: 抽项工厂模式
 */
public abstract class AbstractFactory {

    //方便于统一的管理
    //与接口的区别,不仅仅只有接口的功能,还有抽象的逻辑;接口只是一接口

    /**
     * 获取bmCar
     * @return
     */
    public abstract Car getBmCar();

    /**
     * 获取bcCar
     * @return
     */
    public abstract Car getBcCar();

}

Test.java

package com.demo.gc.abstr;

/**
 * @description:
 */
public class Test {

    public static void main(String[] args) {

        CarFactory factory=new CarFactory();
        System.out.println(factory.getBcCar().getCarName());
        System.out.println(factory.getBmCar().getCarName());
    }
}

六:区别

  1. 简单工厂:在同级结构里面可生产任意产品,在遵循开闭原则的情况下,不支持扩展
  2. 工厂方法:在同级结构里面只能生产固定的产品,在遵循开闭原则的情况下,支持拓展
  3. 抽象工厂:用来产出所有产品

作者:佛祖
来源:简书

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

推荐阅读更多精彩内容

  • 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。通常我们所说的工厂模式是指工厂方法模...
    zfylin阅读 1,314评论 0 7
  • 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一...
    justCode_阅读 1,198评论 1 6
  • 今天学习下最常见的工厂模式,工厂模式细分下来有三大类: 他们的目标都是一样的:封装对象的创建。但是实现手段和使用场...
    西木柚子阅读 2,153评论 7 28
  • 设计原则: 要依赖抽象,不要依赖具体类 目录 本文的结构如下: 什么是抽象工厂模式 为什么要用该模式 模式的结构 ...
    w1992wishes阅读 1,114评论 0 6
  • 今儿天阴冷,监考一上午,冻了一上午,中午到家12点,回来做好饭,确切的说是热好饭,多亏冰箱里有妈让哥送来的...
    公主的羽衣阅读 206评论 0 0