当前位置: 首页 > news >正文

抽象工厂模式(AbstractFactoryPattern)

文章目录

  • 1.抽象工厂模式定义
  • 2.UML类图
  • 3.抽象工厂模式具体实现
    • 工厂模式实现单一产品族
    • 抽象工厂实现多产品族
    • 产品类
    • 工厂类
    • 使用
  • 4.抽象工厂模式优缺点

1.抽象工厂模式定义

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 工厂方法模式是单一产品族,抽象工厂方模式是多系列产品族。

2.UML类图

在这里插入图片描述

  • 抽象工厂:声明了创建抽象产品对象的操作接口。
  • 具体产品工厂:实现了抽象工厂的接口,负责创建产品对象。
  • 产品抽象类或接口:定义一类产品对象的接口。
  • 具体产品实现:定义一个将被相应具体工厂创建的产品对象。

3.抽象工厂模式具体实现

本文基于生产电脑周边产品的例子

工厂模式实现单一产品族

public abstract class Keyboard 
{// 生产键盘public abstract void Create();
}public class HPKeyboard : Keyboard
{public override void Create(){Console.WriteLine("生产惠普键盘");}
}public class DellKeyboard : Keyboard
{public override void Create(){Console.WriteLine("生产戴尔键盘");}
}public class LenovoKeyboard : Keyboard
{public override void Create(){Console.WriteLine("生产联想键盘");}
}// 键盘工厂抽象类
public abstract class KeyboardFactory
{// 取得键盘实例public abstract Keyboard GetInstance();
}public class HPKeyboardFactory : KeyboardFactory
{public override Keyboard GetInstance(){return new HPKeyboard();}
}public class DellKeyboardFactory : KeyboardFactory
{public override Keyboard GetInstance(){return new DellKeyboard();}
}public class LenoveKeyboardFactory : KeyboardFactory
{public override Keyboard GetInstance(){return new LenovoKeyboard();}
}

使用:

// 生产惠普键盘
new HPKeyboardFactory().GetInstance().Create();
// 生产戴尔键盘
new DellKeyboardFactory().GetInstance().Create();
// 生产联想键盘
new LenoveKeyboardFactory().GetInstance().Create();

抽象工厂实现多产品族

产品类

// 鼠标抽象类
public abstract class Mouse
{public abstract void Create();
}public class DellMouse : Mouse
{public override void Create(){Console.WriteLine("生产戴尔鼠标");}
}public class HPMouse : Mouse
{public override void Create(){Console.WriteLine("生产惠普鼠标");}
}// 显示器抽象类
public abstract class Monitor
{public abstract void Create();
}public class DellMonitor : Monitor
{public override void Create(){Console.WriteLine("生产戴尔显示器");}
}public class HPMonitor : Monitor
{public override void Create(){Console.WriteLine("生产惠普显示器");}
}

工厂类

// 工厂抽象类。工厂分为Dell工厂和HP工厂,各自负责品牌内产品的创建
public abstract class Factory
{public abstract Keyboard CreateKeyboard();public abstract Mouse CreateMouse();public abstract Monitor CreateMonitor();
}public class DellFactory : Factory
{public override Keyboard CreateKeyboard(){return new DellKeyboard();}public override Monitor CreateMonitor(){return new DellMonitor();}public override Mouse CreateMouse(){return new DellMouse();}
}public class HPFactory : Factory
{public override Keyboard CreateKeyboard(){return new HPKeyboard();}public override Monitor CreateMonitor(){return new HPMonitor();}public override Mouse CreateMouse(){return new HPMouse();}
}

使用

// 抽象工厂模式
Console.WriteLine("----------------------- 抽象工厂模式 ----------------------------");
new DellFactory().CreateKeyboard().Create();    // 生产戴尔键盘
new DellFactory().CreateMonitor().Create();     // 生产戴尔显示器
new DellFactory().CreateMouse().Create();       // 生产戴尔鼠标new HPFactory().CreateKeyboard().Create();      // 生产惠普键盘
new HPFactory().CreateMonitor().Create();      // 生产惠普显示器
new HPFactory().CreateMouse().Create();      // 生产惠普鼠标

4.抽象工厂模式优缺点

  • 优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
  • 缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

相关文章:

  • SQL刷题笔记day2
  • Convolutional Occupancy Networks【ECCV2020】
  • 《主对角线求和》
  • 2024云曦期中考(部分复现)
  • 【图论及其运用 — 电子科技大学】(四)第四章 欧拉图与哈密尔顿图(Euler 图与 Hamilton 图)
  • 电子招投标系统源码实现与立项流程:基于Spring Boot、Mybatis、Redis和Layui的企业电子招采平台
  • 炫酷网页设计:HTML5 + CSS3打造8种心形特效
  • 如何通过IP地址来防范“杀猪盘”?
  • QT5.15.2及以上版本安装
  • 掌握代码注释:提升代码可读性的秘密武器
  • 2024电工杯数学建模A题Matlab代码+结果表数据教学
  • Python——基于共享单车使用量数据的可视化分析(1)
  • 浏览器API与协议
  • java组合设计模式Composite Pattern
  • 【话题】你眼中的IT行业现状与未来趋势
  • 4. 路由到控制器 - Laravel从零开始教程
  • axios 和 cookie 的那些事
  • ES2017异步函数现已正式可用
  • go append函数以及写入
  • interface和setter,getter
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • leetcode98. Validate Binary Search Tree
  • MySQL数据库运维之数据恢复
  • npx命令介绍
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • ------- 计算机网络基础
  • 记录一下第一次使用npm
  • 老板让我十分钟上手nx-admin
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 设计模式 开闭原则
  • 深度解析利用ES6进行Promise封装总结
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 算法系列——算法入门之递归分而治之思想的实现
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 阿里云服务器购买完整流程
  • 从如何停掉 Promise 链说起
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (2022 CVPR) Unbiased Teacher v2
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (三)终结任务
  • (十六)视图变换 正交投影 透视投影
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • *** 2003
  • ***检测工具之RKHunter AIDE
  • .bat批处理(一):@echo off
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .Net Core 中间件验签
  • .NET MVC第三章、三种传值方式
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .net操作Excel出错解决