抽象工厂模式(Abstract Factory):为创建一组相关或者互相依赖的对象提供一个接口,而无需指定它们对应的具体类。
通用类图如下:

例如,我们现在有两种产品A和B,而产品A和B分别都有两个厂商1和2进行生产,在这里我们把不同的厂商1、厂商2理解为牌子1和牌子2,那么厂商1就生产A1、B1,厂商2生产A2、B2。
此时,不同的厂商肯定要生产自己的产品(如A1、B1),每个厂商都有自己的一系列产品,这就与上面抽象工厂模式的描述类似了。
该例子的类图如下:

具体代码实现如下:
//定义不同的产品之间的一定具备的标准,用interface实现
//其中的method()方法可看作提取出不同产品的共性,如手机都有类似的功能
interface IProductA{
  public void method();
}

interface IProductB{
  public void method();
}

//实现了产品标准实现的一系列具体产品
//由于已经设计好A1由厂商1生产,故以下输出代码有“厂商x”
class ProductA1 implements IProductA{
  public void method() {
    System.out.println("厂商1    生产ProductA1 ...");
  }
}

class ProductA2 implements IProductA{
  public void method() {
    System.out.println("厂商2    生产ProductA2 ...");
  }
}

class ProductB1 implements IProductB{
  public void method() {
    System.out.println("厂商1    生产ProductB1 ...");
  }
}

class ProductB2 implements IProductB{
  public void method() {
    System.out.println("厂商2    生产ProductB2 ...");
  }
}

//每一种牌子的产品生产工厂,即不同的厂商负责自己牌子产品的生产
abstract class Factory1{
  abstract IProductA getProductA1();
  abstract IProductB getProductB1();
}

abstract class Factory2{
  abstract IProductA getProductA2();
  abstract IProductB getProductB2();
}

//具体的工厂用来生产相关的产品
class ConcreteFactory1 extends Factory1{
  public IProductA getProductA1() {
    return new ProductA1();
  }
  public IProductB getProductB1() {
    return new ProductB1();
  }
}

class ConcreteFactoryB extends Factory2{
  public IProductA getProductA2() {
    return new ProductA2();
  }
  public IProductB getProductB2() {
    return new ProductB2();
  }
}

//测试类
public class Client {
  public static void main(String[] args) {
    //厂商1负责生产产品A1、B1
    Factory1 factory1 = new ConcreteFactory1();
    IProductA productA1 = factory1.getProductA1();
    IProductB productB1 = factory1.getProductB1();
    
    productA1.method();
    productB1.method();
    
    //厂商2负责生产产品A2、B2
    Factory2 factory2 = new ConcreteFactoryB();
    IProductA productA2 = factory2.getProductA2();
    IProductB productB2 = factory2.getProductB2();
    
    productA2.method();
    productB2.method();
  }
}

运行结果:
厂商1  生产ProductA1 ...
厂商1  生产ProductB1 ...
厂商2  生产ProductA2 ...
厂商2  生产ProductB2 ...

其实,上例中本来可以不用到了两个抽象工厂,只剩一个也可,但是这样子与我们现实生活中不同厂商各自生产自己的产品有点不同,所以就将其分开为两个了,也就是将两个厂商完全地分离开。
由上面类图可以知道,一旦任何一个厂商开发出了产品C的话,那么这个厂商肯定需要扩展自己的工厂来投入到C产品的生产中,那么此时工厂1和工厂2就需要进行一定的改变了,这很明显不符合开闭原则。

转载于:https://blog.51cto.com/haolloyin/332802

(Abstract Factory)抽象工厂模式的Java实现相关推荐

  1. Java 设计模式之 Abstract Factory 抽象工厂模式

    在工厂方法基础上,将工厂的生产方法的返回类型从具体产品抽象为抽象产品,同时扩展工厂的方法,支持任意定制产品族,则工厂方法可以升级为抽象工厂模式,比如一家餐厅可以提供牛排(方法A),红酒(方法B),蔬菜 ...

  2. 设计模式学习总结1 - 创建型1 - Abstract Factory抽象工厂模式

    AbstractFactory抽象工厂模式(创建型) 作用: 这种模式支持创建不同的对象,这些对象功能接近且一般都是在一起创建的.抽象工厂被具体化成不同的工厂来创建类似产品的不同产品.这种模式将类于使 ...

  3. Abstract Factory抽象工厂模式

    抽象工厂模式是是用一个超级工厂去创建其他工厂,简单点说就是工厂的父类,属于创建型模式. 目标:提供一个创建一组对象的方法,而无需指定它们具体的类(同工厂方法). 使用场景:系统的产品有多于一个的产品族 ...

  4. 笔记:设计模式(3)-Abstract Factory抽象工厂模式

      工厂模式的起源 1.变化点在"对象的创建",因此就封装"对象创建": 2.面向接口编程,依赖接口,而非依赖实现. 动机(Motivation) 在系统中,经 ...

  5. 09Abstract Factory(抽象工厂)模式

    技术交流QQ群:1027579432,欢迎你的加入! 1.Abstract Factory(抽象工厂)模式动机 在软件系统中,经常面临着一系列相互依赖的对象的创建工作.同时,由于需求的变化,往往存在更 ...

  6. 设计模式—抽象工厂模式(java实现示例)

    一.相关定义 抽象工厂: 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种 ...

  7. 简单工厂模式,工厂方法模式,抽象工厂模式总结-java版

    文章目录 LOG:更新日志 一.简单工厂模式,工厂方法模式,抽象工厂模式定义 二.三种工厂模式的优缺点以及适用场景 三.名词解释 四.简单工厂模式.工厂方法模式与抽象工厂模式之间的区别 五.抽象工厂模 ...

  8. 设计模式之抽象工厂模式(Abstract Factory)摘录

    面向对象系统的分析和设计实际上追求的就是两点:高内聚(Cohesion)和低耦合(Coupling). 23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.Fa ...

  9. 应用抽象工厂模式自己动手写一个ioc

    本文的作者Danny hui似乎是TTS上的新人,我从Google搜不出一点关于本人的信息.从通过本文可以看出他对模式与IoC有自己独到的见解,本文在TTS上引发很多网友回帖,反响不一.那么我们现在来 ...

  10. 抽象工厂模式,工厂方法模式区别

    抽象工厂模式 转载自:https://www.shiyanlou.com/courses/document/867 一.本节目标 我们本节课程主要介绍[抽象工厂模式]的相关知识,将会涉及以下内容: 什 ...

最新文章

  1. 直播预告 | AAAI 2022论文解读:基于对比学习的预训练语言模型剪枝压缩
  2. Elasticsearch线程池介绍
  3. php字符串连接符、三元运算符
  4. 美团点评技术年货:900+页电子书,覆盖前端、后台、大数据、算法……(附下载链接)...
  5. pipeline(管道的连续应用)
  6. java B2B2C springmvc mybatis电子商城系统-分布式配置中心(Spring Cloud Config)
  7. Linux公网渗透抓鸡实验
  8. RK3568 Android12 移除电池图标和设置选项
  9. JavaWeb程序填空题
  10. OpenGL开发-第6章-纹理,让物体更漂亮
  11. 如何用Amira分割DICOM图像
  12. [ZJOI2004]沼泽鳄鱼
  13. 使用百度翻译开发平台,英文翻译为中文
  14. oracle 基础语法(二)
  15. springboot项目Banner配置
  16. 旅游攻略app开发定制
  17. Python(4)循环嵌套算法及冒泡排序
  18. android 使用asm.jar将android手机屏幕投影到电脑上
  19. pandas 字符串切片后保存_pandas:快速处理字符串方法
  20. 微信小程序开发系列——3. 腾讯云服务器配置

热门文章

  1. IE9 pinned sites for Win7
  2. Redis(RedisTemplate)使用string字符串
  3. 红帽学习笔记[RHCSA] 第二课[文件、目录、相关命令]
  4. createrepo命令
  5. Win32 编程
  6. Vue webapp项目通过HBulider打包原生APP
  7. jQuery的对象访问函数(get,index,size,each)
  8. Pig 实现关键词匹配
  9. 一个很方便使用十六进制的颜色值的宏
  10. Cainteoir Text-to-Speech 0.8 发布