实例分析

大白话工厂方法模式(Factory Method)一文中,我们讲解了日产4S店工厂规模的扩大,创建了针对不同车型的工厂,减少了工厂的工作内容,提高了效率。下面我们继续以4S店的故事讨论抽象工厂模式。

为了满足各个阶层的客户,日产公司推出了豪华系列品牌英菲尼迪,而且为了吸引客户购买,购车赠送行车记录仪,购买日产汽车赠送日产行车记录仪。购买英菲尼迪汽车赠送英菲尼迪行车记录仪。

通过上面的描述我们引出产品族和等级结构的定义。

产品族:即来自一个家族,比如英菲尼迪汽车和英菲尼迪行车记录仪都来自英菲尼迪家族,日产汽车和日产行车记录仪都来自日产家族。

等级结构:可以理解为相同的产品,比如英菲尼迪汽车和日产汽车处于同一个等级结构,英菲尼迪行车记录仪和日产行车记录仪处于同一个等级结构。

现在假设工厂分为日产工厂和英菲尼迪工厂,且汽车和行车记录仪都只有一种型号。日产工厂需要生产相同产品族的日产汽车和日产行车记录仪。英菲尼迪工厂需要生产相同产品族的英菲尼迪汽车和英菲尼迪行车记录仪。

通过对比,发现和工厂方法模式的区别为:

工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构

代码如下:

代码片段1 汽车父类

/**
* 汽车的父类
* @author coderzcr
*/
public abstract class Car {
String name;
void printCar(){
System.out.println(name+"汽车已制造完成");
}
}

代码片段2 日产汽车

/**
* 日产汽车
* @author coderzcr
*/
public class NissanCar extends Car {
NissanCar(){
this.name = "日产";
}
}

代码片段3 英菲尼迪汽车

/**
* 英菲尼迪汽车
* @author coderzcr
*/
public class InfinitiCar extends Car {
InfinitiCar(){
this.name = "英菲尼迪";
}
}

代码片段4 行车记录仪父类

/**
* 行车记录仪父类
* @author coderzcr
*/
public abstract class DVR {
String name;
void printDVR(){
System.out.println(name+"行车记录仪已制造完成");
}
}

代码片段5 日产行车记录仪

/**
* 日产行车记录仪
* @author coderzcr
*/
public class NissanDVR extends DVR{
NissanDVR(){
this.name = "日产";
}
}

代码片段6 英菲尼迪行车记录仪

/**
* 英菲尼迪行车记录仪
* @author coderzcr
*/
public class InfinitiDVR extends DVR {
InfinitiDVR(){
this.name = "英菲尼迪";
} }

代码片段7 工厂父类

/**
* 工厂父类
* @author coderzcr
*/
public abstract class AbstractFactory {
abstract Car getCar();
abstract DVR getDVR();
}

代码片段8 日产工厂

/**
* 日产工厂
* @author coderzcr
*/
public class NissanFactory extends AbstractFactory {
@Override
Car getCar() {
return new NissanCar();
} @Override
DVR getDVR() {
return new NissanDVR();
}
}

代码片段9 英菲尼迪工厂

/**
* 英菲尼迪工厂
* @author coderzcr
*/
public class InfinitiFactory extends AbstractFactory {
@Override
Car getCar() {
return new InfinitiCar();
} @Override
DVR getDVR() {
return new InfinitiDVR();
}
}

图1 类图

抽象工厂模式定义

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

抽象工厂模式结构

图2抽象工厂模式类图

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

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

抽象工厂模式分析

优点分析

  • 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易。所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。另外,应用抽象工厂模式可以实现高内聚低耦合的设计目的,因此抽象工厂模式得到了广泛的应用。
  • 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。这对一些需要根据当前环境来决定其行为的软件系统来说,是一种非常实用的设计模式。
  • 增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。

缺点分析

  • 在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及到对抽象工厂角色及其所有子类的修改,显然会带来较大的不便。
  • 开闭原则的倾斜性(增加新的工厂和产品族容易,增加新的产品等级结构麻烦)。

参考文献

  1. 3. 抽象工厂模式(Abstract Factory) — Graphic Design Patterns
  2. 设计模式(三)抽象工厂模式 · 写最好的设计模式专栏 · 看云

大白话抽象工厂模式(Abstract Factory Pattern)的更多相关文章

  1. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...

  2. 【设计模式】抽象工厂模式 Abstract Factory Pattern

    简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...

  3. 设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释

    抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2709 ...

  4. 二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Messag ...

  5. 【UE4 设计模式】抽象工厂模式 Abstract Factory Pattern

    概述 描述 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类:具体的工厂负责实现具体的产品实例 抽象工厂中每个工厂可以创建多种产品(如苹果公司生产iPhone.iPad): 工厂方法 ...

  6. Net设计模式实例之抽象工厂模式(Abstract Factory Pattern)

    一.抽象工厂模式简介(Bref Introduction) 抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类.优点 ...

  7. 设计模式之抽象工厂模式(Abstract Factory Pattern)

    一.抽象工厂模式的由来 抽象工厂模式,最开始是为了解决操作系统按钮和窗体风格,而产生的一种设计模式.例如:在windows系统中,我们要用windows设定的按钮和窗体,当我们切换Linux系统时,要 ...

  8. C#设计模式——抽象工厂模式(Abstract Factory Pattern)

    一.概述在软件开发中,常常会需要创建一系列相互依赖的对象,同时,由于需求的变化,往往存在较多系列对象的创建工作.如果采用常规的创建方法(new),会造成客户程序和对象创建工作的紧耦合.对此,抽象工厂模 ...

  9. 六个创建模式之抽象工厂模式(Abstract Factory Pattern)

    问题: 使用工厂方法模式的主要问题是工厂类过多,每个产品对应一个工厂,不利于维护.因此可以考虑使用一个工厂创建一个产品族. 定义: 提供创建一些列相关或相互依赖的对象实例的接口,这些类可以称为一个产品 ...

  10. 抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式概述 定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类 抽象工厂抽象工厂,顾名思义,就是比工厂模式更抽象的工厂模式.在工厂模式中,一个具体工厂只负责生产一个具体产品 ...

随机推荐

  1. 使用DataX同步MaxCompute数据到TableStore(原OTS)优化指南

    概述 现在越来越多的技术架构下会组合使用MaxCompute和TableStore,用MaxCompute作大数据分析,计算的结果会导出到TableStore提供在线访问.MaxCompute提供海量 ...

  2. 如何把thinkphp 的url改为.html

    ThinkPHP支持伪静态URL设置,可以通过设置URL_HTML_SUFFIX参数随意在URL的最后增加你想要的静态后缀,而不会影响当前操作的正常执行.例如,我们设置'URL_HTML_SUFFIX ...

  3. Springboot2 Logback mybatis 打印sql执行语句

    把这个加入到logback.xml 中就可以打印mysql的日志了 <logger name="jdbc.sqltiming" level="debug" ...

  4. GPUtil是一个Python模块,使用nvidia-smi从NVIDA GPU获取GPU状态

    GPUtil是一个Python模块,使用nvidia-smi从NVIDA GPU获取GPU状态 一个Python模块,用于在Python中使用nvidia-smi以编程方式从NVIDA GPU获取GP ...

  5. 全面解读Python Web开发框架Django,利用Django构建web应用及其部署

    全面解读Python Web开发框架Django Django是一个开源的Web应用框架,由Python写成.采用MVC的软件设计模式,主要目标是使得开发复杂的.数据库驱动的网站变得简单.Django ...

  6. 2018-2-25-git-rebase-合并多个提交

    title author date CreateTime categories git rebase 合并多个提交 lindexi 2018-02-25 11:41:26 +0800 2018-2-1 ...

  7. Django入门3--Models

  8. Django入门1--Django是什么?Django里文件的作用?

    Django项目目录介绍: wsgi.py文件介绍: urls.py文件介绍: __init__.py文件介绍:

  9. CodeForces 1204E"Natasha, Sasha and the Prefix Sums"(动态规划 or 组合数学--卡特兰数的应用)

    传送门 •参考资料 [1]:CF1204E Natasha, Sasha and the Prefix Sums(动态规划+组合数) •题意 由 n 个 1 和 m 个 -1 组成的 $C_{n+m} ...

  10. junit 测试套件Suite

    junit测试套件,就是可以运行一个测试类使得一个或一些测试类被junit测试运行 见代码: 测试套件类: import org.junit.runner.RunWith; import org.ju ...