设计模式—抽象工厂模式

原创 2016年05月30日 19:04:34

本文博客同步发表在http://hjxandhmr.github.io/2016/05/30/DesignPattern-AbstractFactory/

前面我们学习了了简单工厂模式工厂方法模式,今天我们来学习设计模式中最后的一种工厂模式——抽象工厂模式(Abstract Factory Pattern),它属于类创建型模式。

抽象工厂模式其实是工厂方法模式的一种扩展,应用抽象工厂模式可以创建一系列的产品(产品族),而不是像工厂方法模式中的只能创建一种产品。

模式定义

为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

模式结构

抽象工厂模式包含如下角色:

AbstractFactory: 抽象工厂
ConcreteFactory: 具体工厂
AbstractProduct: 抽象产品
Product: 具体产品

UML图

这里写图片描述

代码实现

AbstractFactory.java

public interface AbstractFactory {

    Cpu createCpu();

    Mainboard createMainboard();
}

AmdFactory.java


public class AmdFactory implements AbstractFactory {

    @Override
    public Cpu createCpu() {
        return new AmdCpu();
    }

    @Override
    public Mainboard createMainboard() {
        return new AmdMainboard();
    }
}

IntelFactory.java


public class IntelFactory implements AbstractFactory {

    @Override
    public Cpu createCpu() {
        return new IntelCpu();
    }

    @Override
    public Mainboard createMainboard() {
        return new IntelMainboard();
    }
}

Mainboard.java


public interface Mainboard {

    void installCpu();
}

IntelMainboard.java

public class IntelMainboard implements Mainboard {

    public IntelMainboard() {
        System.out.println("Create IntelMainboard");
    }

    @Override
    public void installCpu() {
        System.out.println("IntelMainboard installCpu");
    }
}

AmdMainboard.java

public class AmdMainboard implements Mainboard {

    public AmdMainboard() {
        System.out.println("Create AmdMainboard");
    }

    @Override
    public void installCpu() {
        System.out.println(" AmdMainboard installCpu");
    }
}

ComputerEngineer.java

public class ComputerEngineer  {

    /**
     * 定义组装机需要的CPU
     */
    private Cpu cpu = null;
    /**
     * 定义组装机需要的主板
     */
    private Mainboard mainboard = null;

    public void makeComputer(AbstractFactory af){
        /**
         * 组装机器的基本步骤
         */
        //1:首先准备好装机所需要的配件
        prepareHardwares(af);
        //2:组装机器
        //3:测试机器
        //4:交付客户
    }
    private void prepareHardwares(AbstractFactory af){
        //这里要去准备CPU和主板的具体实现,为了示例简单,这里只准备这两个
        //可是,装机工程师并不知道如何去创建,怎么办呢?

        //直接找相应的工厂获取
        cpu = af.createCpu();
        mainboard = af.createMainboard();

        //测试配件是否好用
        cpu.calculate();
        mainboard.installCpu();
    }
}

测试类


public class MyClass {
    public static void main(String[]args){
        //创建装机工程师对象
        ComputerEngineer cf = new ComputerEngineer();
        //客户选择并创建需要使用的产品对象
        AbstractFactory af = new IntelFactory();
        //告诉装机工程师自己选择的产品,让装机工程师组装电脑
        cf.makeComputer(af);
    }
}

模式分析

每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式针对的是多个产品等级结构。有多少个产品等级结构,就会在工厂角色中发现多少个工厂方法。每一个产品等级结构中有多少个具体的产品,就有多少个产品族,也就会在工厂等级结构中发现多少个具体工厂。

抽象工厂模式的优点

  • 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易。所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。另外,应用抽象工厂模式可以实现高内聚低耦合的设计目的,因此抽象工厂模式得到了广泛的应用。

  • 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。这对一些需要根据当前环境来决定其行为的软件系统来说,是一种非常实用的设计模式。

  • 增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。

抽象工厂模式的缺点

  • 在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及到对抽象工厂角色及其所有子类的修改,显然会带来较大的不便。

  • 开闭原则的倾斜性(增加新的工厂和产品族容易,增加新的产品等级结构麻烦)。

到现在为止,设计模式中的所有工厂类的模式就都已经学习完了。

参考
http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/abstract_factory.html
http://www.cnblogs.com/ytaozhao/p/3392149.html

欢迎大家关注我的微信公众号,我会不定期的分享些Android开发的技巧

这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

设计模式 — 抽象工厂模式 (AbstractFactory)

本文将借助C++来介绍抽象工厂模式。

java语言实现创建型设计模式—抽象工厂模式

一、描述 抽象工厂模式是在工厂方法的模式上进一步抽象而来,如果说工厂方法模式是对一个产品结构的创建而言的话,那么抽象工厂模式则是针对多个产品结构而言的,它被用来一次创建多个不同的产品对象。 我们要创建...

<Java设计模式>—抽象工厂模式

设计模式>—抽象工厂模式 抽象工厂的定义其实和工厂方法模式定义差不多,具体的可以去看看工厂方法模式,下面主要说说区别:     从UML类图上面观察,抽象工厂和工厂方法主要的区别就是生产的产品...

设计模式之四:抽象工厂模式—产品族的创建

工厂方法模式的问题: 每个工厂只生产一个产品,导致系统中存在大量的工厂类,增加系统的开销,将相同的产品组成一个产品族,由同一个工厂来创建 抽象工厂模式概述: 抽象工厂模式为创建一组对象提供了...

设计模式学习笔记—抽象工厂模式

抽象工厂开始之前,我不得不先说一句,关于工厂方法,我以为不太常用来着。而实际上,想到当年在学校,老师在教三层的时候告诉我们,service 与 dao 层必须都要继承自接口,并提供一个实现类,只是神秘...

设计模式之对象创建型 — abstract_factory 抽象工厂模式

本系列博客示例代码均为C++代码 实例说明 抽象工厂模式可以用一个很好的栗子来说明,比如在写一个贪吃蛇游戏, 这款游戏有很多中游戏模式,比如有经典模式,挑战模式。 游戏中可能有 砖...

JAVA设计模式 — 抽象工厂模式(Abstract Factory)

定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。 类型:对象创建型模式 类图: 抽象工厂模式与工厂方法模式的区别         抽象工厂模式是工厂方法模式的升...
  • FX_SKY
  • FX_SKY
  • 2013-01-05 15:37
  • 1319

设计模式学习03—抽象工厂模式

1、动机与定义      工厂模式中,一个工厂只能提供一个或一类产品,当产品种类较多,形成产品系列(比如我们要创建跨平台的按钮,菜单,文本框等等一系列GUI控件:      单纯使用工厂模式会产生大量...

04@设计模式—(02)抽象工厂模式

抽象工厂模式是基于一个父类工厂(super-factory)之上创建其他的工长(factories)。这个工厂也被成文工厂实例对象(factories)的工厂。这种设计模式属于创建的模式(creati...

设计模式学习(十四)————抽象工厂模式(使用Qt框架的反射技术——根据字符串动态创建类来实现)

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类!这个例子也可以用简单工厂模式+反射+读取配置文件来完成,这样更加简洁!!!普通的抽象工厂模式下面通过一个模拟访问数据库...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)