设计模式-工厂模式

工厂模式可以简单的分为三类

  • 简单工厂
  • 工厂
  • 抽象工厂

本篇只记录工厂和抽象工厂。

前言

在介绍工厂模式之前,我们需要先了解一下产品族体系结构和产品等级体系结构,这样对于我们理解工厂模式更有利。

定义/概念

  • 产品等级结构:指在某一产品大类中不同的产品项目所构成的不同形式
  • 产品族体系结构:产品族设计一般都是从市场分析、对顾客的需求调查分析开始的,顾客的需求分析模型是产品平台规划的基础,是指顾客需求信息被采集、分析、取舍、分类、结构化并转换为设计规范的过程。

举例理解

在我们日常购物中,一定会有这样一种烦恼,比如买家用电器,如果想买空调,大家首先想到的就是格力,三菱,美的,大金等,但是如果想到冰箱,可能大家又会想到西门子,海尔等。但是如果这几家大厂只生产一种家用电器,那竞争力就太弱了,因此海尔也会有空调,洗衣机。同样美的一样有冰箱,洗衣机等。这就引出来了我们上述的概念问题。

  • 产品等级结构:空调,冰箱,洗衣机(无关品牌)

我们可以看到,无关于品牌,只关注于产品类别,这就属于产品等级。

  • 产品族体系结构:
    • 海尔
      • 空调
      • 冰箱
      • 洗衣机
    • 美的
      • 空调
      • 冰箱
      • 洗衣机

我们可以看到 在同一品牌下的不同产品,就属于产品族。

工厂模式

工厂模式主要就是来体现产品等级这一概念的。

场景

我们这里假如需要购买空调,那么就会去选择哪个大厂生产的空调。使用代码来体现这种场景,就属于工厂模式的一种实现。

1.首先我们要买空调,那么就需要有一个空调,但是又不知道选择何种品牌的空调,因此我们用一个抽象类表示。

/**
 * @ClassName AirConditioning
 * @Description 空调类
 * @Author Neal
 * @Date 2019/3/6 14:55
 * @Version 1.0
 */
public abstract class AirConditioning {

    /**
     * 购买空调
     */
    public abstract void buy();
}

2.然后我们需要知道空调的生产厂,同样生产厂商很多,我们不能明确,那么就也来一个抽象类。

/**
 * @ClassName AirConditioningFactory
 * @Description 空调生产工厂
 * @Author Neal
 * @Date 2019/3/6 14:56
 * @Version 1.0
 */
public abstract class AirConditioningFactory {

    /**
     * 生产空调
     * @return
     */
    public abstract AirConditioning produce();
}

3.现在我们去商场,了解到了,恩,需要格力或者美的的空调好。那么我们就需要格力和美的的生产工厂来生产对应的空调。

美的工厂

/**
 * @ClassName MideaFactory
 * @Description 美的生产工厂
 * @Author Neal
 * @Date 2019/3/6 15:00
 * @Version 1.0
 */
public class MideaFactory extends AirConditioningFactory{

    public AirConditioning produce() {
        System.out.println("美的工厂生产的空调");
        return new MideaAir();
    }
}

美的空调

/**
 * @ClassName MideaAir
 * @Description 美的空调
 * @Author Neal
 * @Date 2019/3/6 14:58
 * @Version 1.0
 */
public class MideaAir extends AirConditioning{
    public void buy() {
        System.out.println("购买美的空调");
    }
}

格力工厂

/**
 * @ClassName GreeFactory
 * @Description 格力工厂
 * @Author Neal
 * @Date 2019/3/6 15:01
 * @Version 1.0
 */
public class GreeFactory extends AirConditioningFactory {
    public AirConditioning produce() {
        System.out.println("格力工厂生产的空调");
        return new GreeAir();
    }
}

格力空调

/**
 * @ClassName GreeAir
 * @Description 格力空调
 * @Author Neal
 * @Date 2019/3/6 14:59
 * @Version 1.0
 */
public class GreeAir extends AirConditioning{
    public void buy() {
        System.out.println("购买格力空调");
    }
}

4.现在就让我们去选购吧。

/**
 * @ClassName Customer
 * @Description 顾客
 * @Author Neal
 * @Date 2019/3/6 15:03
 * @Version 1.0
 */
public class Customer {

    public static void main(String[] args) {

        System.out.println("顾客去商场跟导购员说,我想要一个格力空调");
        System.out.println("首先导购员给客户找到是格力工厂生产的空调");
        AirConditioningFactory greeFactory = new GreeFactory();
        System.out.println("接着告诉客户这是格力生产的");
        AirConditioning greeAir = greeFactory.produce();
        System.out.println("客户不满意,觉得美的好,又让导购员展示美的空调");
        AirConditioningFactory mideaFactory = new MideaFactory();


        System.out.println("导购给客户看了几个美的生产的空调");
        AirConditioning mideaAir =  mideaFactory.produce();
        System.out.println("客户很满意,决定购买");
        mideaAir.buy();

    }
}

我们可以通过启动类来看到,我们想要什么工厂,导购员只需要创建出该工厂对象,然后获取到工厂生产的空调即可。因此我们只需要修改上层应用即可。如果我们想购买三菱的空调,那么我们只需要在创建一个三菱的工厂和空调即可。

5.我们来看一下类图。

工厂模式.png

抽象工厂模式

抽象工厂就是来体现产品族体系结构的。

场景

我们买完空调之后,觉得洗衣机和冰箱也有点旧了,正好商场有活动,购买同一品牌的商品,套餐购买享5折优惠,套餐就是包括空调,洗衣机,冰箱。这么算下来,非常合适。既然这么合适,那么让我们使用代码来实现一下吧。

1.同样我们需要一个电器工厂,这里我们也不知道具体是哪个电器工厂,那么我们就使用接口来实现一下。

/**
 * @InterfaceName ElectricFactory
 * @Description 电器工厂
 * @Author Neal
 * @Date 2019/3/6 15:36
 * @Version 1.0
 */
public interface ElectricFactory {

    /**
     * 生产空调
     * @return
     */
    AirConditioning produceAirConditioning();

    /**
     * 生产冰箱
     * @return
     */
    Refrigerator produceRefrigerator();

    /**
     * 生产洗衣机
     * @return
     */
    Washer produceWasher();

}

2.我们一组需要产品族。

空调

/**
 * @ClassName AirConditioning
 * @Description 空调
 * @Author Neal
 * @Date 2019/3/6 15:37
 * @Version 1.0
 */
public abstract class AirConditioning {
    public abstract void buy();
}

冰箱

/**
 * @ClassName Refrigerator
 * @Description 冰箱
 * @Author Neal
 * @Date 2019/3/6 15:37
 * @Version 1.0
 */
public abstract class Refrigerator {
    public abstract void buy();
}

洗衣机

/**
 * @ClassName Washer
 * @Description 洗衣机
 * @Author Neal
 * @Date 2019/3/6 15:38
 * @Version 1.0
 */
public abstract class Washer {
    public abstract void buy();
}

3.我们来规定一个品牌工厂---美的工厂。

/**
 * @ClassName MideaFactory
 * @Description 美的生产工厂
 * @Author Neal
 * @Date 2019/3/6 15:46
 * @Version 1.0
 */
public class MideaFactory implements ElectricFactory {

    public AirConditioning produceAirConditioning() {
        return new MideaAirConditioning();
    }

    public Refrigerator produceRefrigerator() {
        return new MideaRefrigerator();
    }

    public Washer produceWasher() {
        return new MideaWasher();
    }
}

4.这一产品的产品族。

美的空调

/**
 * @ClassName MideaAirConditioning
 * @Description 美的空调
 * @Author Neal
 * @Date 2019/3/6 15:47
 * @Version 1.0
 */
public class MideaAirConditioning extends AirConditioning {
    public void buy() {
        System.out.println("购买套餐,美的空调");
    }
}

美的冰箱

/**
 * @ClassName MideaRefrigerator
 * @Description 美的冰箱
 * @Author Neal
 * @Date 2019/3/6 15:48
 * @Version 1.0
 */
public class MideaRefrigerator extends Refrigerator {
    public void buy() {
        System.out.println("购买套餐,美的冰箱");
    }
}

美的洗衣机

/**
 * @ClassName MideaWasher
 * @Description 美的洗衣机
 * @Author Neal
 * @Date 2019/3/6 15:47
 * @Version 1.0
 */
public class MideaWasher extends Washer {
    public void buy() {
        System.out.println("购买套餐,美的洗衣机");
    }
}

5.大买特买,买买买。

/**
 * @ClassName RichCustomer
 * @Description TODO
 * @Author Neal
 * @Date 2019/3/6 15:54
 * @Version 1.0
 */
public class RichCustomer {

    public static void main(String[] args) {
        System.out.println("挑选美商品");
        ElectricFactory mideaFactory = new MideaFactory();
        System.out.println("挑选空调");
        AirConditioning mideaConditioning  = mideaFactory.produceAirConditioning();
        System.out.println("挑选冰箱");
        Refrigerator mideaRefrigerator = mideaFactory.produceRefrigerator();
        System.out.println("挑选洗衣机");
        Washer mideaWasher  = mideaFactory.produceWasher();

        System.out.println("购买套餐");
        mideaConditioning.buy();
        mideaRefrigerator.buy();
        mideaWasher.buy();

        
    }
}

抽象工厂比较适合,体系比较固定的"产品族",因为他不支持频繁改动,如果工厂接口改动,那么所对应的工厂基本都会改动。

6.类图(这里有新增了格力系列,使我们看的更清晰)

抽象工厂1.png
抽象工厂2.png

结论

希望通过这两个对比,大家可以理解工厂模式。

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

推荐阅读更多精彩内容