美文网首页
抽象工厂模式

抽象工厂模式

作者: more2023 | 来源:发表于2020-05-05 15:27 被阅读0次

    一、前言

    工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,我们可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产,这就是抽象工厂模式的基本思想。

    二、什么是抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern):提供一个接口,用于创建一系列相关或相互依赖对象的家族,而无须指定它们具体的类。抽象工厂模式又称为Kit模式。

    三、为什么使用抽象工厂模式

    抽象工厂模式是对工厂方法模式的进一步扩展。在工厂方法模式中,一个具体的工厂负责生产一类具体的产品,即一对一的关系,但是,如果需要一个具体的工厂生产多种产品对象,那么就需要用到抽象工厂模式了。
    抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构,即产品族。

    1、产品等级结构:

    产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。

    2、产品族:

    在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。

    四、抽象工厂模式的结构

    抽象工厂模式结构图.png

    1、IFactory(抽象工厂类):它声明了一组用于创建一族产品的方法,每一个方法对应一种产品。
    2、Factory1、Factory2(具体工厂类):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。
    3、IProductA、IProductB(抽象产品类):它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。
    4、ProductA、ProductB(具体产品类):它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。

    五、代码示例

    5.1、产品抽象类

    public abstract class TV {
        //电视播放方法
        public abstract void play();
    }
    
    public abstract class PC {
        //电脑上网冲浪方法
        public abstract void surf();
    }
    

    5.2、具体产品类

    public class HaierTv extends TV {
        @Override
        public void play() {
            System.out.println("Haier电视机播放节目 ...");
        }
    }
    
    public class HuaweiTv extends TV {
        @Override
        public void play() {
            System.out.println("HUAWEI电视机播放节目 ...");
        }
    }
    
    public class HaierPc extends PC {
        @Override
        public void surf() {
            System.out.println("Haier电脑上网 ...");
        }
    }
    
    public class HuaweiPc extends PC {
        @Override
        public void surf() {
            System.out.println("HUAWEI电脑上网 ...");
        }
    }
    

    5.3、抽象工厂类

    public abstract class IFactory {
        public abstract TV createTV();
        public abstract PC createPC();
    }
    

    5.4、具体工厂类

    public class HuaweiFactory extends IFactory {
        @Override
        public TV createTV() {
            return new HuaweiTv ();
        }
        @Override
        public PC createPC() {
            return new HuaweiPc ();
        }
    }
    
    public class HaierFactory extends IFactory {
        @Override
        public TV createTV() {
            return new HaierTv ();
        }
        @Override
        public PC createPC() {
            return new HaierPc ();
        }
    }
    

    5.5、客户端类

    public class Client {
        public static void main(String[] args){
            IFactory haierFactory = new HaierFactory ();
            IFactory huaweiFactory = new HuaweiFactory ();
            TV haierTv = haierFactory.createTV();
            PC HaierPc = haierFactory.createPC();
            haierTv.play();
            HaierPc.surf(); 
        }
    }
    

    六、抽象工厂模式的优缺点

    6.1、优点

    相比较工厂方法模式,从以上代码示例可以看出,新增一个新的产品,抽象工厂模式并不比工厂方法模式更为便捷,那么抽象工厂模式的好处在哪呢?它优点就是在于是增加固定类型产品的不同具体工厂比较方便。比如增加一个生产同样类型产品的具体工厂LGFactory,只需要新建LGFactory继承自IFactory就可以了。

    七、工厂方法模式和抽象工厂模式的区别总结

    1、工厂方法模式利用继承,抽象工厂模式利用组合
    2、工厂方法模式产生一个对象,抽象工厂模式产生一族对象
    3、工厂方法模式利用子类创造对象,抽象工厂模式利用接口的实现创造对象

    相关文章

      网友评论

          本文标题:抽象工厂模式

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