美文网首页模型与算法
设计模式-工厂模式

设计模式-工厂模式

作者: NealLemon | 来源:发表于2019-03-06 19:28 被阅读58次

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

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

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

    前言

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

    定义/概念

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

    举例理解

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

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

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

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

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

    工厂模式

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

    场景

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

    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

    结论

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

    相关文章

      网友评论

        本文标题:设计模式-工厂模式

        本文链接:https://www.haomeiwen.com/subject/hohxpqtx.html