zoukankan      html  css  js  c++  java
  • 创建型设计模式(二)抽象工厂模式

    文章更新时间:2020/07/15

    一、一句话背景

      假如我是一个汽车经销商,那我不光是卖车,也得卖相关的配件吧,比如润滑油,轮胎之类的...

      基于这个需求那我能不能整一个抽象的工厂,我需要啥直接告诉这个抽象工厂,具体生产哪一类产品让这个抽象工厂自己去对接,这样我不管需要啥都只用找这个抽象工厂的负责人就可以,而不用找每一类具体产品工厂的负责人,我可就省事多了~

    二、使用场景

    使用场景:调用一整套产品族的场景。

    如:参加不同类型的抽奖活动,QQ换皮肤

    优点:抽象工厂可以简单的理解成为其他工厂的总工厂,基于这个概念我们可以把一整套的东西再次进行抽象出来,这样调用起来就更方便了。

    缺点:如果抽象工厂功能十分强大时(可创建工厂的种类很多时),工厂类中会有很多无关代码,会显得比较杂乱(工厂类继承抽象工厂,需要实现抽象工厂的抽象方法)

    三、模型分析

    抽象工厂定义创建抽象产品的方法,由具体工厂去继承,生成具体产品

    抽象产品定义产品的共有属性和方法,由具体产品去继承

    具体工厂实现/继承工厂类,生产具体产品

    具体产品实现/继承抽象产品

    四、UML类图

       从UML类图来看,抽象工厂模式工厂方法模式其实大体上是差不多的,他们的区别主要在于:

      区别主要在于产品。

    工厂方法模式:

    • 定义一个用于创建对象的接口,让子类决定实例化哪一个类,主要是生成一类相关的产品
    • 工厂模式针对的是产品单一的情况,即一个产品等级结构

    抽象工厂模式:

    • 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类,通常生成一系列相关的产品
    • 抽象工厂模式针对的是面向多个业务品种、业务分类,即多个产品等级结构
    • 抽象工厂是在工厂方法的基础上再次提炼出一层更具“通性”的工厂,使生产一类产品变为生产一系列产品

    五、代码分析

    抽象工厂

    /**
     * 汽车工厂【抽象工厂】
     */
    public abstract class CarAbstractFactory {
        //组装发动机【抽象产品】
        public abstract Motor packageMotor() throws Exception;
    
        //组装轮胎【抽象产品】
        public abstract Tyre packageTyre() throws Exception;
    }

    具体工厂

    奥迪工厂 

    /**
     * 奥迪工厂【具体工厂】
     */
    public class AudiFactory extends CarAbstractFactory {
    
        //具体的属性
        private Motor motor;
        private Tyre tyre;
    
    
        //组装发动机
        @Override
        public Motor packageMotor() throws Exception {
            Motor motor = new AudiMotor();
            this.motor = motor;
            return motor;
        }
    
    
        //组装轮胎
        @Override
        public Tyre packageTyre() throws Exception {
            Tyre tyre = new GTYTyre();
            this.tyre = tyre;
            return tyre;
        }
    
        /**
         * 输出汽车信息
         */
        public void carInfo() {
            System.out.println("=====获得一辆奥迪车,配置如下=====");
            this.motor.motorInfo();
            this.tyre.tyreInfo();
        }
    
    }

    奔驰工厂 

    /**
     * 奔驰工厂【具体工厂】
     */
    public class BenzFactory extends CarAbstractFactory {
    
        //具体的属性
        private Motor motor;
        private Tyre tyre;
    
    
        //组装发动机
        @Override
        public Motor packageMotor() throws Exception {
            Motor motor = new BenzMotor();
            this.motor = motor;
            return motor;
        }
    
    
        //组装轮胎
        @Override
        public Tyre packageTyre() throws Exception {
            Tyre tyre = new MQLTyre();
            this.tyre = tyre;
            return tyre;
        }
    
        /**
         * 输出汽车信息
         */
        public void carInfo() {
            System.out.println("=====获得一辆奔驰车,配置如下=====");
            this.motor.motorInfo();
            this.tyre.tyreInfo();
        }
    
    }

    宝马工厂 

    /**
     * 宝马车工厂【具体工厂】
     */
    public class BmwFactory extends CarAbstractFactory {
    
        //具体的属性
        private Motor motor;
        private Tyre tyre;
    
    
        //组装发动机
        @Override
        public Motor packageMotor() throws Exception {
            Motor motor = new BmwMotor();
            this.motor = motor;
            return motor;
        }
    
    
        //组装轮胎
        @Override
        public Tyre packageTyre() throws Exception {
            Tyre tyre = new MQLTyre();
            this.tyre = tyre;
            return tyre;
        }
    
        /**
         * 输出汽车信息
         */
        public void carInfo() {
            System.out.println("=====获得一辆宝马车,配置如下=====");
            this.motor.motorInfo();
            this.tyre.tyreInfo();
        }
        
    }

    抽象产品

    发动机

    /**
     * 发动机【抽象产品】
     */
    public abstract class Motor {
    
        /**
         * 发动机信息
         */
        public abstract void motorInfo();
    
    }

    轮胎

    /**
     * 轮胎【抽象产品】
     */
    public abstract class Tyre {
    
        /**
         * 轮胎信息
         */
        public abstract void tyreInfo();
    
    }

    具体产品

    奥迪发动机 

    /**
     * 奥迪发动机【具体产品】
     */
    public class AudiMotor extends Motor {
    
        @Override
        public void motorInfo() {
            System.out.println("=====奥迪发动机=====");
            System.out.println("加速:⭐⭐⭐");
            System.out.println("极速:⭐⭐⭐⭐");
        }
    }

    奔驰发动机 

    /**
     * 奔驰发动机【具体产品】
     */
    public class BenzMotor extends Motor {
    
        @Override
        public void motorInfo() {
            System.out.println("=====奔驰发动机=====");
            System.out.println("加速:⭐⭐⭐⭐");
            System.out.println("极速:⭐⭐⭐");
        }
    }

    宝马发动机 

    /**
     * 宝马发动机【具体产品】
     */
    public class BmwMotor extends Motor {
    
        @Override
        public void motorInfo() {
            System.out.println("=====宝马发动机=====");
            System.out.println("加速:⭐⭐⭐⭐⭐");
            System.out.println("极速:⭐⭐⭐⭐");
        }
    }

    固特异轮胎 

    /**
     * 固特异轮胎【具体产品】
     */
    public class GTYTyre extends Tyre {
    
        @Override
        public void tyreInfo() {
            System.out.println("=====固特异轮胎=====");
            System.out.println("耐用指数:⭐⭐⭐⭐");
            System.out.println("抓地力:⭐⭐⭐");
        }
    }

    米其林轮胎 

    /**
     * 米其林轮胎【具体产品】
     */
    public class MQLTyre extends Tyre {
    
        @Override
        public void tyreInfo() {
            System.out.println("=====米其林轮胎=====");
            System.out.println("耐用指数:⭐⭐⭐⭐⭐");
            System.out.println("抓地力:⭐⭐⭐⭐");
        }
    }

    客户下单

    /**
     * 抽象工厂模式测试类【模拟下单】
     */
    public class AbstractFactoryTest {
        public static void main(String[] args) throws Exception {
            /*需求:客户要买一辆宝马车*/
    
            //1、获取宝马工厂
            CarAbstractFactory carFactory = new BmwFactory();
            //2、组装发动机
            carFactory.packageMotor();
            //3、组装轮胎
            carFactory.packageTyre();
            //4、输出车车配置信息
            ((BmwFactory) carFactory).carInfo();
        }
    }

  • 相关阅读:
    从左边或右边删除字符串-python 使用lstrip
    MapReduce- 学习9313第一节记录 材料源于百度百科
    138. (待解决)复制带随机指针的链表
    19. 删除链表的倒数第N个节点-链表(leetcode)
    347.前k个高频元素-counter(leetcode)
    python二进制、十进制、8进制、16进制转换(转)
    POJ 1715
    POJ 1306
    POJ 2436
    POJ 2249
  • 原文地址:https://www.cnblogs.com/riches/p/11200185.html
Copyright © 2011-2022 走看看