C#设计模式之2-抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/391 访问。
抽象工厂模式属于创建型模式,为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。
角色:
1、抽象工厂(Creator)
是抽象工厂方法模式的核心角色,任何在模式中创建的对象的工厂类必须实现这此产品族接口;
2、具体工厂(Concrete Creator)
这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象;
3、抽象产品(Product)
所要创建的对象的基类,也就是产品对象的共同父类或共同拥有的接口;
4、具体产品(Concrete Product)
这个角色实现了抽象产品角色所定义的接口。
示例:
命名空间AbstractFactory中包含手机基类MobilePhone、便携式设备基类Tablet和计算机基类Computer,以及它们对应的6个实现类。抽象设备工厂类DeviceFactory包含2个实现类中国工厂ChineseFactory类和美国工厂AmericanFactory类。在智能设备竞争如此激烈的今天,我将尝试用2个不同的工厂来生产一批智能设备,以使大家能够了解抽象工厂模式的正确使用方法。
namespace AbstractFactory
public abstract class MobilePhone {
public abstract void Print();
}
抽象手机类MobilePhone,产品族中的一员。
public class ApplePhone : MobilePhone {
public override void Print() {
Console.WriteLine("Apple Phone is created by American Factory!");
}
}
苹果手机实现类ApplePhone,具体的产品。
public class HuaWeiPhone : MobilePhone {
public override void Print() {
Console.WriteLine("HuaWei Phone is created by Chinese Factory!");
}
}
华为手机实现类HuaWeiPhone,具体的产品。
public abstract class Computer {
public abstract void Print();
}
抽象计算机类Computer,产品族中的一员。
public class DellComputer : Computer {
public override void Print() {
Console.WriteLine("Dell Computer is created by American Factory!");
}
}
戴尔计算机实现类DellComputer,具体的产品。
public class LenovoComputer : Computer {
public override void Print() {
Console.WriteLine("Lenovo Computer is created by Chinese Factory!");
}
}
联想计算机实现类LenovoComputer,具体的产品。
public abstract class Tablet {
public abstract void Print();
}
抽象便携式设备类Tablet,产品族中的一员。
public class Nexus10 : Tablet {
public override void Print() {
Console.WriteLine("Nexus10 is created by American Factory!");
}
}
Nexus10便携式设备实现类Nexus10,具体的产品。
public class XiaoMiPad : Tablet {
public override void Print() {
Console.WriteLine("XiaoMiPad is created by Chinese Factory!");
}
}
小米平板便携式设备实现类XiaoMiPad,具体的产品。
public abstract class DeviceFactory {
public abstract MobilePhone CreateMobilePhone();
public abstract Computer CreateComputer();
public abstract Tablet CreatePad();
}
智能设备生产工厂基类,它定义了一个产品族的生成接口,这是区别于工厂方法模式的主要模块。
public class AmericanFactory : DeviceFactory {
public override MobilePhone CreateMobilePhone() {
return new ApplePhone();
}
public override Computer CreateComputer() {
return new DellComputer();
}
public override Tablet CreatePad() {
return new Nexus10();
}
}
美国工厂类AmericanFactory,是一个具体的智能设备生产工厂。
public class ChineseFactory : DeviceFactory {
public override MobilePhone CreateMobilePhone() {
return new HuaWeiPhone();
}
public override Computer CreateComputer() {
return new LenovoComputer();
}
public override Tablet CreatePad() {
return new XiaoMiPad();
}
}
中国工厂类ChineseFactory,是一个具体的智能设备生产工厂。
public class CreateDevice<T> where T : DeviceFactory {
private static T _deviceFactory = null;
public static void Create() {
_deviceFactory = Activator.CreateInstance<T>();
_deviceFactory.CreateMobilePhone().Print();
_deviceFactory.CreateComputer().Print();
_deviceFactory.CreatePad().Print();
}
}
一个辅助类,帮助我生产智能设备并向命令行输出结果。
public class Program {
public static void Main(string[] args) {
CreateDevice<ChineseFactory>.Create();
CreateDevice<AmericanFactory>.Create();
Console.ReadKey();
}
}
以上是调用方的代码,以下是这个案例的输出结果:
HuaWei Phone is created by Chinese Factory!
Lenovo Computer is created by Chinese Factory!
XiaoMiPad is created by Chinese Factory!
Apple Phone is created by American Factory!
Dell Computer is created by American Factory!
Nexus10 is created by American Factory!
优点:
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/391 访问。
1、能够从多个产品族的多个产品中,简洁的获取想要的具体产品;
2、解决了工厂模式中的不符合开闭原则的问题。
缺点:
1、产品族扩展比较困难,要增加一个系列的某一产品,要增加具体的产品类,还要增加对应的工厂类。
使用场景:
1、一个系统不要求依赖产品类实例如何被创建、组合和表达的表达,这点也是所有工厂模式应用的前提;
2、这个系统有多个系列产品,而系统中只消费其中某一系列产品;
3、系统要求提供一个产品类的库,所有产品以同样的接口出现,客户端不需要依赖具体实现。
C#设计模式之2-抽象工厂模式的更多相关文章
- 大话设计模式C++版——抽象工厂模式
前面说过,简单工厂模式是最基础的一种设计模式,那以工厂命名的设计模式就是23种设计模式中最多的一种,他们一脉相承,一步一步进化而来,这里就是其中的最后一种——抽象工厂模式(Abstract Facto ...
- JAVA常用设计模式(一、抽象工厂模式)
抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最 ...
- 设计模式学习心得<抽象工厂模式 Abstract Factory>
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ...
- C#设计模式系列:抽象工厂模式(AbstractFactory)
出自:http://www.cnblogs.com/libingql/archive/2012/12/09/2809754.html 1. 抽象工厂模式简介 1.1 定义 抽象工厂(Abstract ...
- [Python编程实战] 第一章 python的创建型设计模式1.1抽象工厂模式
注:关乎对象的创建方式的设计模式就是“创建型设计模式”(creational design pattern) 1.1 抽象工厂模式 “抽象工厂模式”(Abstract Factory Pattern) ...
- IOS设计模式浅析之抽象工厂模式(Abstract Factory)
概述 在前面两章中,分别介绍了简单工厂模式和工厂方法模式,我们知道简单工厂模式的优点是去除了客户端与具体产品的依赖,缺点是违反了“开放-关闭原则”:工厂方法模式克服了简单工厂模式的缺点,将产品的创建工 ...
- 大话设计模式Python实现- 抽象工厂模式
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的类 下面是一个抽象工厂的demo: #!/usr/bin/env pyth ...
- 【java设计模式】-03抽象工厂模式
抽象工厂 简述 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类.在抽象工厂模式中,接口是负责创建一个相关对象的工厂 ...
- 一天一个设计模式——Abstract Factory抽象工厂模式
一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂 ...
- 重学 Java 设计模式:实战抽象工厂模式
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!
随机推荐
- As 布局文件太多很乱的问题
//添加自定义文件整理文件夹的方法,没有之一在build.gradle(Module: app)里加入布局需要放入的路径代码>>>>>> sourceSets { ...
- Android 性能优化 ---- 内存优化
1.Android内存管理机制 1.1 Java内存分配模型 先上一张JVM将内存划分区域的图 程序计数器:存储当前线程执行目标方法执行到第几行. 栈内存:Java栈中存放的是一个个栈帧,每个栈帧对应 ...
- 太慢不能忍!CPU又拿硬盘和网卡开刀了!
总线技术 我是CPU一号车间的阿Q,最近为了一件事儿搞得我挺烦的. 当初我们CPU工厂刚刚来到主板上建厂时,那时候主板上的单位还不多,跟我们打交道最多的就是内存那家伙了. 后来,键盘.鼠标.硬盘.网卡 ...
- C#winform将dll封装到exe当中
我们在在winform程序时经常会用到外部dll,正常情况下,我的exe运行文件旁就需要这些dll文件相伴,总感觉不爽~~特别是要把软件给别人的时候,如果DLL比较多或者没有放在同一个地方,那麻烦大了 ...
- Python os.getcwdu() 方法
概述 os.getcwdu() 方法用于返回一个当前工作目录的Unicode对象.高佣联盟 www.cgewang.com Unix, Windows 系统下可用. 语法 getcwdu()方法语法格 ...
- PHP imagecolorclosesthwb - 取得与指定的颜色最接近的色度的黑白色的索引
imagecolorclosesthwb — 取得与指定的颜色最接近的色度的黑白色的索引.高佣联盟 www.cgewang.com 语法 int imagecolorclosesthwb (s res ...
- PHP zip_read() 函数
定义和用法 zip_read() 函数读取打开的 zip 档案中的下一个文件.高佣联盟 www.cgewang.com 如果成功,该函数则返回包含 zip 档案中一个文件的资源.如果没有更多的项目可供 ...
- luogu P4775 [NOI2018]情报中心 线段树合并 虚树 树的直径trick
LINK:情报中心 神题! 写了一下午 写到肚子疼. 调了一晚上 调到ex 用的是网上dalao的方法 跑的挺快的. 对于链的暴力 我不太会kk. 直接说正解吧: 分类讨论两种情况: 1 答案的两条链 ...
- C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目
C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...
- BSOJ 5445 -- 【2018雅礼】树 prufer序列 dp
BSOJ在哪我也不知道 没有链接. 对于有标号无根树的统计和有度数限制 一般采用prufer序列. 根据prufer序列 容易知道 某个点的出现次数+1为当前点的度数. 对于这道题 考虑设f[i][j ...