抽象工厂模式

2020-05-05  本文已影响0人  more2023

一、前言

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

二、什么是抽象工厂模式

抽象工厂模式(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、工厂方法模式利用子类创造对象,抽象工厂模式利用接口的实现创造对象

上一篇下一篇

猜你喜欢

热点阅读