文章目录

  • 1、 抽象工厂模式概述
    • 1.1、 核心组件
    • 1.2、 优点缺点
  • 2、 `Java`实现
    • 2.1、 工厂及产品结构的定义
    • 2.2、 具体工厂类的实现
  • 3、 `Python`实现
  • 4、 `Go`实现

1、 抽象工厂模式概述

抽象工厂模式(Abstract Factory)[GOF95]是一种对象的创建模式,是在工厂方法模式上的又一次改进,主要应用于多等级产品结构的项目架构中,将产品对象的创建过程产品对象的使用过程解耦合,使用抽象工厂模式的架构中业务模型从工厂对象中获取到产品对象,只需要关注产品对象的使用即可,而可能添加了较为复杂业务逻辑的创建过程封装在工厂内部,让系统中各个模块的责任更加明确。

1.1、 核心组件

抽象工厂模式中的核心组件,主要是对多等级类型架构的一种解决方案,核心包含了高度抽象的工厂接口,产品接口以及具体的实现过程,其架构如图所示:

  • 抽象工厂角色【Abstract Factory】:上图中的Factory,抽象工程概念方法模式的核心,与应用系统的商业逻辑无关,主要是工厂方法标准化的定义和构建。
  • 具体工厂角色【Concrete Factory】:上图中的MobileFactory以及ComputerFactory,该角色包含具体产品对象的创建业务逻辑,在使用时可以直接调用创建对应的产品对象。
  • 抽象产品角色【Abstract Product】:上图中的Xiaomi或者Dell,抽象产品体系可以是1到n套相同体系的产品结构,抽象产品体系的公共数据抽象就是抽象产品角色。
  • 具体产品角色【Concrete Product】:具体业务逻辑的实现类型,由具体工厂角色负责创建的实例对象,包含了具体业务处理逻辑的实例。

1.2、 优点缺点

抽象工厂模式最早是在操作系统构建过程中落地的一个设计概念,不同的操作系统在处理窗口以及窗口中的按钮、文字时涉及到类似的构建过程,在该架构模式下工厂架构和对应的产品架构之间会产生对应的耦合关系,在业务逻辑中必须使用具体的某个产品系列,可以支持相似架构的其他产品系列,如果是类似的模式可以通过抽象工厂设计模式进行架构,作为创建模式中一种非常经典的设计模式,是很多设计模式的最原始的实现架构,在该模式的基础上可以变通实现多种设计实现。

优点:

  • 产品的创建、组合和表现形式解耦合,在系统中形成两套不同的体系,将构建与业务分离。
  • 多个产品系统可以无缝切换,并且不会影响整体系统的稳定性。
  • 客户端依赖系统的抽象层,所有产品体系结构相似,客户端不依赖产品实现。
  • 系统整体扩展性提高,满足OCP原则。

缺点:

  • 多个产品体系必须相似【固定架构模式,设计约束性较高】
  • 业务无关代码的冗余较多。

2、 Java实现

2.1、 工厂及产品结构的定义

package com.damu.inter;/*** <p>项目文档: 抽象工厂声明</p>** @author 大牧* @version V1.0*/
public interface IFactory<T> {/*** 产品创建方法* @param objects 参数列表* @return 创建好的产品对象*/T product(Object ... objects);
}
---------------------------------------------
package com.damu.inter;/*** <p>项目文档: 抽象产品声明</p>** @author 大牧* @version V1.0*/
public interface IProduct {String getInformation();
}

2.2、 具体工厂类的实现

游戏本工厂类

package com.damu.factory;import com.damu.inter.IFactory;
import com.damu.inter.IProduct;
import com.damu.product.XiaomiGameComputer;/*** <p>项目文档: 游戏计算机制造工厂类</p>** @author 大牧* @version V1.0*/
public class GameComputerFactory implements IFactory<IProduct> {@Overridepublic IProduct product(Object... objects) {return null;}/*** 小米游戏本制造方法* @return 小米游戏本*/public IProduct productXiaomi() {return new XiaomiGameComputer();}/*** Dell游戏本制造方法* @return Dell游戏本*/public IProduct productDell() {return null;}
}

商务本工厂处理类

package com.damu.factory;import com.damu.inter.IFactory;
import com.damu.inter.IProduct;
import com.damu.product.XiaomiBusinessComputer;/*** <p>项目文档: 商务计算机制造工厂类</p>** @author 大牧* @version V1.0*/
public class BusinessComputerFactory implements IFactory<IProduct> {@Overridepublic IProduct product(Object... objects) {return null;}/*** 小米商务本制造方法* @return 小米商务本对象*/public IProduct productXiaomi() {return new XiaomiBusinessComputer();}/*** 戴尔商务本制造方法* @return 戴尔商务本*/public IProduct productDell() {return null;}
}

学生本工厂处理类

package com.damu.factory;import com.damu.inter.IFactory;
import com.damu.inter.IProduct;
import com.damu.product.XiaomiEduComputer;/*** <p>项目文档: 学生计算机制造工厂类</p>** @author 大牧* @version V1.0*/
public class EduComputerFactory implements IFactory<IProduct> {@Overridepublic IProduct product(Object... objects) {return null;}/*** 小米学生本制造方法* @return 小米学生本*/public IProduct productXiaomi() {return new XiaomiEduComputer();}/*** Dell学生本制造方法* @return Dell学生本*/public IProduct productDell() {return null;}
}

具体产品体系的父类构建

package com.damu.inter.extend;import com.damu.inter.IProduct;/*** <p>项目文档: Dell产品父类</p>** @author 大牧* @version V1.0*/
public interface IDell extends IProduct {}
----------------------------------------------
package com.damu.inter.extend;import com.damu.inter.IProduct;/*** <p>项目文档: 小米产品父类</p>** @author 大牧* @version V1.0*/
public interface IXiaomi extends IProduct {}

具体产品构建

package com.damu.product;import com.damu.inter.extend.IXiaomi;/*** <p>项目文档: TODO</p>** @author 大牧* @version V1.0*/
public class XiaomiGameComputer implements IXiaomi {@Overridepublic String getInformation() {return "小米游戏本,最佳性价比";}
}
--------------------------------------------
package com.damu.product;import com.damu.inter.extend.IXiaomi;/*** <p>项目文档: TODO</p>** @author 大牧* @version V1.0*/
public class XiaomiBusinessComputer implements IXiaomi {@Overridepublic String getInformation() {return "小米商务本,最佳选择";}
}
--------------------------------------------
package com.damu.product;import com.damu.inter.extend.IDell;/*** <p>项目文档: TODO</p>** @author 大牧* @version V1.0*/
public class DellGameComputer implements IDell {@Overridepublic String getInformation() {return "Dell游戏,Alienware,王者归来";}
}package com.damu.product;import com.damu.inter.extend.IXiaomi;/*** <p>项目文档: TODO</p>** @author 大牧* @version V1.0*/
public class XiaomiEduComputer implements IXiaomi {@Overridepublic String getInformation() {return "小米学生本,学生党的福利";}
}
--------------------------------------------
package com.damu.product;import com.damu.inter.extend.IDell;/*** <p>项目文档: TODO</p>** @author 大牧* @version V1.0*/
public class DellGameComputer implements IDell {@Overridepublic String getInformation() {return "Dell游戏,Alienware,王者归来";}
}
--------------------------------------------more.....

测试代码,使用工厂构建产品过程

package com.damu.main;import com.damu.factory.GameComputerFactory;
import com.damu.inter.IFactory;
import com.damu.inter.IProduct;
import com.damu.product.XiaomiGameComputer;/*** <p>项目文档: TODO</p>** @author 大牧* @version V1.0*/
public class Main {public static void main(String[] args) {// 创建工厂对象GameComputerFactory factory = new GameComputerFactory();// 创建小米游戏本IProduct productXiaomi = factory.productXiaomi();System.out.println(productXiaomi.getInformation());// 创建Dell游戏本IProduct productDell = factory.productDell();System.out.println(productDell.getInformation());// more....}
}

3、 Python实现

"""
抽象工厂模式
"""
import abc# ------------------------------------------ 接口层
class IFactory(metaclass=abc.ABCMeta):"""工厂接口"""@abc.abstractmethoddef product(self):raise NotImplementedError("该方法必须在子类中实现")class IProduct(metaclass=abc.ABCMeta):"""产品抽象接口"""def get_information(self):raise NotImplementedError("该方法必须在产品子类中实现")# ------------------------------------------ 抽象层
class DellComputer(IProduct):"""Dell电脑产品抽象类"""passclass XiaomiComputer(IProduct):"""小米产品抽象类"""pass# ------------------------------------------ 实现层
class XiaomiGameComputer(IProduct):"""产品具体:小米游戏本"""def get_information(self):print("小米游戏,品质佳轩")class DellGameComputer(IProduct):"""产品具体:Dell游戏本"""def get_information(self):print("Dell游戏,Alienware出击")class GameComputerFactory(IFactory):"""游戏本工厂处理类"""def product(self):print("小米游戏本:product_xiaomi(); Dell游戏本:product_dell()")def product_xiaomi(self):return XiaomiGameComputer()def product_dell(self):return DellGameComputer()# 其他 具体产品 对应 具体工厂 产品体系和工厂体系保持一致即可if __name__ == "__main__":# 创建工厂对象game_factory = GameComputerFactory()# 创建具体产品xiao_mi = game_factory.product_xiaomi()dell = game_factory.product_dell()# 打印xiao_mi.get_information()dell.get_information()

4、 Go实现

package mainimport "fmt"/*************** 接口层 ****************/
type IProduct interface {// 抽象产品接口GetInformation() string
}type IFactory interface {// 抽象工厂接口product() IProduct
}/*************** 抽象产品层 ****************/
type XiaomiComputer interface {IProduct
}type DellComputer interface {IProduct
}/*************** 具体产品层 ****************/
type XiaomiGameComputer struct {XiaomiComputer
}func (computer XiaomiGameComputer) GetInformation() string {return "小米游戏,品质佳选"
}type DellGameComputer struct {DellComputer
}func (computer DellGameComputer) GetInformation() string {return "Alienware,笔记本中的王者"
}/*************** 具体工厂层 ****************/
type GameComputerFactory struct {}func (gameComputerFactory GameComputerFactory) product_xiaomi() IProduct {return new(XiaomiGameComputer)
}func (gameComputerFactory GameComputerFactory) product_dell() IProduct {return new(DellGameComputer)
}/*************** 具体测试 ****************/
func main()  {// 创建工厂对象gameComputerFactory := new(GameComputerFactory)// 创建具体产品dellComputer := gameComputerFactory.product_dell()fmt.Println(dellComputer.GetInformation())xiaomiComputer := gameComputerFactory.product_xiaomi()fmt.Println(xiaomiComputer.GetInformation())
}

大牧絮叨设计模式:抽象工厂模式相关推荐

  1. 大牧絮叨设计模式:工厂方法模式

    文章目录 1. 工厂方法模式概述 1.1. 工厂方法模式核心组件 1.2. 工厂方法模式优缺点 2. `Java`实现 (1) 核心工厂声明 (2) 核心产品声明 (3) 产品具体实现 (4) 工厂具 ...

  2. 大牧絮叨设计模式:建造者模式

    文章目录 1. `建造模式` 概述 1.1. 核心组件 1.2. 优点缺陷 2. `Java` 实现 2.1. 抽象建造者`Builder` 2.2. 内聚组件`Aggregation Product ...

  3. 大牧絮叨设计模式:原型模式

    文章目录 1. `原型模式`概述 1.1. 核心组件 1.2. 优点缺陷 2. `Java`实现 2.1. 原型抽象 2.2. 原型实现 2.3. 原型对象管理器 2.4. 消费者 2.5. `深.浅 ...

  4. 系统架构技能之设计模式-抽象工厂模式

    一.上篇回顾 上篇我们主要讲述了简单工厂模式和工厂模式.并且分析了每种模式的应用场景和一些优缺点,我们现在来回顾一下: 简单工厂模式:一个工厂负责所有类型对象的创建,不支持无缝的新增新的类型对象的创建 ...

  5. 常见设计模式—抽象工厂模式

    设计模式-抽象工厂模式 1.什么是抽象工厂模式 抽象工厂模式是围绕一个超级工厂创建其它工厂,是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品. 2.角色分 ...

  6. 【JAVA进阶系列】JAVA 设计模式 -- 抽象工厂模式(Abstract Factory)

    [JAVA进阶系列]JAVA 设计模式 -- 抽象工厂模式(Abstract Factory) [1.1]抽象工厂模式简介 抽象工厂者模式的类结构图 AbstractProduct(抽象产品),Abs ...

  7. java设计模式---抽象工厂模式

    工厂模式在项目中是常常用到的,有人说只有大项目才会用到,小项目是体会不出来.其实使用设计模式与项目的大小没有实质性的联系.设计模式是经验的总结而不是衡量项目大小的标准. 以开发项目的DAO层为例,在项 ...

  8. [设计模式] ------ 抽象工厂模式

    抽象工厂模式 抽象工厂模式,就是对工厂方法模式加以改进而已,其实就是用简单工厂模式的套路创建各个工厂,后面和工厂模式就一模一样了. 其实就是相当于将创建哪个工厂的权利再次放给调用端. 调用端在调用的时 ...

  9. 一文学透设计模式——抽象工厂模式

    创建者模式 抽象工厂模式 概念 抽象工厂模式是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这是很多地方对于抽象工厂 ...

最新文章

  1. linux中 pwd *****,linux命令自己写--pwd
  2. 如何使用 rsync 备份 Linux 系统的一些介绍
  3. 下两个网段转发的路由设置_收藏 | 多台路由器,不同网段的设备之间如何互访?...
  4. [Head First Java] - 简单的建议程序
  5. 〖Linux〗简单的将Shell和一些文件打包成一个单独的“可执行文件”
  6. excel清空sheet内容 poi_Excel隐藏了一个sheet表,java poi中是可以读出来的,现在我不想读取隐藏的sheet表。...
  7. 工作中应该发火,勿感情用词
  8. 【Datawhale IntelVINO学习笔记】OpenVINO音频和人体姿态识别
  9. 全功能短视频平台去水印解析页面源码
  10. Google 开发者账号关联被封后怎么办
  11. 【拜小白opencv】15-利用ROI将一幅图像叠加到另一幅图像的指定位置
  12. VMware安装虚拟机出现STOP: 0x0000005d错误
  13. 从Garmin USB中读取GPS数据(串口实现)
  14. 使用批处理脚本修改hosts文件
  15. 国内三大PTPrivate Tracker站分析
  16. 1688、京东、拼多多各大电商平台API接口调用示例
  17. 什么是僵尸进程(Zombie Processes)
  18. 怎么把PicPick设置成中文版?
  19. 信号与系统--连续时间系统分析
  20. 程序员来聊一聊信用卡(一)——年轻人该不该办理一张信用卡

热门文章

  1. 如何解决笔记本电脑---网络状态未知 依赖服务或组无法启动
  2. Android Root工程仓库万能大法
  3. 签名 html5,在HTML5表单中使用涂写签名
  4. 一线互联网架构师设计思想解读开源框架!附超全教程文档
  5. win7 计算机不显示u盘重装系统,u盘重装系统win7步骤和详细教程
  6. 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)(Finchley版本)
  7. 考研英语“倒装句型”长难句解析
  8. 怎样用matlab打开mat文件
  9. Java charAt() 方法
  10. Oracle项目管理系统之合同请款管理