模型与算法

设计模式-工厂模式

2019-03-06  本文已影响58人  NealLemon

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

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

前言

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

定义/概念

举例理解

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

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

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

工厂模式

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

场景

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

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

结论

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

上一篇下一篇

猜你喜欢

热点阅读