设计模式之抽象工厂模式

来源:互联网 发布:日本社交软件 编辑:程序博客网 时间:2024/05/22 11:36

抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

一、抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。其UML图如下:

这里写图片描述

抽象工厂模式由以下部分组成:

抽象工厂(AbstractFactory):超级工厂,用来创建其他工厂。

具体工厂(ConcreteFactory):具体工厂“继承”抽象工厂。

抽象产品(AbstractProduct):生产某个产品。

具体产品(ConcreteProduct):具体产品”继承“抽象产品。

二、案例分析

在设计模式系列之工厂方法模式中,我们以《西游记》中妖怪的背景,介绍了工厂方法,但妖怪不仅有强大的背景,还要有一群小弟啊,才能和孙悟空抗衡啊,显然工厂方法已经满足不了我们的要求了,这样的情况就要用到抽象工厂模式,其UML图如下:

这里写图片描述

代码部分:

抽象工厂:生产既有背景又有小弟的妖怪

abstract class AbstractFactory{    public abstract AbstractBGProduct backGroundFactory();    public abstract AbstractEProduct Factory();}

具体工厂:

class ConcreteFactory1 extends AbstractFactory{    @Override    public AbstractBGProduct backGroundFactory() {        return new BGProduct1();    }    @Override    public AbstractEProduct Factory() {        return new EProduct1();    }}class ConcreteFactory2 extends AbstractFactory{    @Override    public AbstractBGProduct backGroundFactory() {        return new BGProduct2();    }    @Override    public AbstractEProduct Factory() {        return new EProduct2();    }}

抽象产品:① 产生背景 ②配备小弟

abstract class AbstractBGProduct{    public abstract void backGround();}abstract class AbstractEProduct{    public abstract void employee();}

具体产品:

 class BGProduct1 extends AbstractBGProduct{    public void backGround() {        System.out.println("我是金皘洞兕大王,我要吃唐僧肉,我本是太上老君的青牛。");    }}class BGProduct2 extends AbstractBGProduct{    public void backGround() {        System.out.println("我是黄眉怪,我要吃唐僧肉。我本是弥勒的童儿。");    }}class EProduct1 extends AbstractEProduct{    public void employee() {        System.out.println("我兕大王的小弟有很多。");    }}class EProduct2 extends AbstractEProduct{    public void employee() {        System.out.println("孩儿们,你们在那里?");    }}

故事上演:

public class FactoryMethod {    public static void main(String[] args) {        AbstractFactory af = new ConcreteFactory1();        AbstractBGProduct bg = af.backGroundFactory();        AbstractEProduct emp = af.Factory();        bg.backGround();        emp.employee();        System.out.println("再来一个妖精");        af = new ConcreteFactory2();        bg = af.backGroundFactory();        emp = af.Factory();        bg.backGround();        emp.employee();    }}

运行结果(亲测结果可以通过):

这里写图片描述

代码地址: AbstractFactory

三、工厂方法模式和抽象工厂模式的区别

工厂方法模式:

一个抽象产品类,可以派生多个具体产品类
一个抽象工厂类,可以派生多个具体工厂类
每个具体工厂类只能创建一个具体产品类的实例

抽象工厂模式:

多个抽象产品类,每个抽象产品类,可以派生多个具体产品类
一个抽象工厂类,可以派生多个具体工厂类
每个具体工厂类可以创建多个具体产品类的实例

综上,抽象工厂模式是工厂方法模式的升级版本,它用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。

在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。

欢迎大家留言评论,点击查看更多设计模式。