美文网首页
设计模式四(产品的细化-抽象工厂模式)

设计模式四(产品的细化-抽象工厂模式)

作者: 先生_吕 | 来源:发表于2017-11-18 15:07 被阅读24次

    前言

    上一个模式我们知道了工厂方法模式,以及其主要解决的问题和优缺点,以及其相比简单工厂模式所做的改进。这次我们看工厂方法模式的再一次进化“抽象工厂模式”。

    在了解抽象工厂模式之前,我们先来回顾一下工厂方法模式(因为抽象工厂模式跟工厂方法模式真的很像,只是在其基础上做了一部分改进),工厂方法模式的角色主要有四个,1、抽象的产品接口,2、具体的产品类,3、抽象的工厂接口,4、具体的工厂类。其较于简单工厂模式抽象了工厂,将产品的创建细化到具体的产品工厂。但是它存在一个问题,到底其存在什么问题呢? 我们看了类图再来分析:

    类图

    2017-11-18_140537.png

    以上是百度给出的抽象工厂模式类图,仔细看看,我们可以发现其与工厂方法模式的区别就在于其产品的抽象接口不在是一个,而是多个,并且每个产品的抽象接口下边又分了好多子产品,这个很好理解,就是讲产品更细化或者说系列化;比如我们生活中的汽车,汽车中很多品牌,奔驰、宝马、奥迪... ... 。奔驰有分为很多系列 G系、S系、E系等等。我们不能所有的奔驰都造成一个样子,更不能所有的汽车都造成一个样子,这就是抽象工厂方法的过人之处,它将产品细分为系列,各个系列产品又由对应系列的工厂去创造,这样就更贴切于生活,当然,代码也更利于开发和维护, 接下来我们写一个抽象工厂方法的案例。

    角色

    一个抽象的工厂接口
    若干个具体产品工厂的实现
    若干个抽象的产品接口
    若干个具体产品的实现

    以下以汽车飞机为例

    (1).若干个产品接口

    /**
    * 一个抽象产品接口(汽车)
    */
    public interface ICar {
       public void run();
    }
    
    /**
    * 一个产品接口(飞机)
    */
    public interface IAirplane {
       public void fly();
    }
    

    (2).若干个具体产品实现

    /**
     * 汽车产品的具体实现一:商务汽车
     */
    public class CarBuss implements ICar {
        public void run() {
            System.out.println("商务车    跑    80km/h");   
        }
    }
    
    /**
     * 汽车产品的具体实现二:军用汽车
     */
    public class CarArmy implements ICar {
        public void run() {
            System.out.println("军车        跑    120km/h");
        }
    }
    
    /**
     * 飞机产品的具体实现一:商务飞机
     */
    public class AirplaneBuss implements IAirplane {
        public void fly() {
            System.out.println("商务机    飞    800km/h");  
        }
    }
    
    /**
     * 飞机产品的具体实现二:军用飞机
     */
    public class AirplaneArmy implements IAirplane {
        public void fly() {
            System.out.println("军机        飞    1200km/h");  
        }
    }
    

    (3).一个抽象工厂接口

    /**
     * 一个抽象的工厂接口
     */
    public interface IFactory {
    
        ICar createCar();
        
        IAirplane createAirplane();
    }
    

    (4).若干个具体工厂实现

    /**
     * 一个具体的工厂(商务产品工厂)
     */
    public class FactoryBuss implements IFactory {
        public ICar createCar() {       
            return new CarBuss();
        }
    
        public IAirplane createAirplane() {     
            return new AirplaneBuss();
        }
    }
    

    (5).测试类

    public class App {
        @Test
        public void fun(){
            //创建一个商务类工厂
            IFactory bussFactory = new FactoryBuss();
            
            ICar bussCar = bussFactory.createCar();
            bussCar.run();
            IAirplane bussPlane = bussFactory.createAirplane();
            bussPlane.fly();
            
            System.out.println("----------------------");
            
            //创建一个军用类工厂
            IFactory armyFactory = new FactoryArmy();
            
            ICar armyCar = armyFactory.createCar();
            armyCar.run();
            IAirplane arymPlane = armyFactory.createAirplane();
            arymPlane.fly();
        }
    }
    
    2017-11-18_143244.png 2017-11-18_145553.png

    工厂系列设置模式基本完成,主要分简单工厂、工厂方法、抽象工厂,以下我们通过各个工厂模式的角色来看看各模式间的不同以及改进

    (简单工厂模式)

    角色1:一个抽象的产品接口
    角色2:若干个具体的产品类
    角色3:一个具体的工厂类

    (工厂方法模式)

    角色1:一个抽象的产品接口
    角色2:若干个具体的产品类
    角色3:一个抽象的工厂接口
    角色4:若干个具体的工厂类

    由简单工厂到工厂方法无非就是江工厂抽象化,将生产产品的工厂具体化
    (抽象工厂模式)

    角色1:若干个抽象的产品接口
    角色2:若干个具体的产品类
    角色3:一个抽象的工厂接口
    角色4:若干个具体的工厂类

    由工厂方法到抽象工厂无非就是将产品抽象化细分,产品的抽象接口不在是一个,而是按某种规则分为多种多系列

    通过比较,我们很明显可以发现工厂模式演变的过程以及每个过程的优化与实现。有关工厂的三个模式到这里就全部介绍完了,三者有着很大的关联和明显的关系,要想灵活运用这三种设计模式,还是要彻底理解它们所针对的问题以及三者的关系。下面罗列下这三种设计模式依次进化的原因。

    1,首先从简单工厂进化到工厂方法,是因为工厂方法弥补了简单工厂对修改开放的弊端,即简单工厂违背了开闭原则。
    2,从工厂方法进化到抽象工厂,是因为抽象工厂弥补了工厂方法只能创造一个系列的产品的弊端。

    相关文章

      网友评论

          本文标题:设计模式四(产品的细化-抽象工厂模式)

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