设计模式之二抽象工厂设计模式

继上篇简单工厂设计模式之后,今天继续讲解抽象工厂设计模式。在简单工厂中,我们的工厂类一次只可以处理一类产品。那么如果我们想处理多类产品,简单工厂是满足不了的。必须要用抽象工厂设计模式。

我们先从概念上来了解下什么是抽象工厂设计模式:

•1、提供一系列相互依赖对象的创建工作
•2、封装对象常规的创建方法(new)
•3、提供统一调用访问方法的方式
•4、避免调用访问方法和具体对象创建工作的紧耦合
这些概念性的东西看起来比较抽象,直接上图

如上图所示,我们如何去更好的理解抽象工厂,首先 我们要分清在这个模式中的几类角色。有抽象工厂,实体工厂,抽象产品,实体产品,客户(调用代码的类)。

•抽象工厂设计模式中各个对象的主要功能、职责:
•1、用抽象工厂生产抽象产品
•2、用实体工厂生产实体产品
•3、用抽象产品提供实体产品访问接口
•4、用实体产品实现自己的功能
直接上代码:
1、定义抽象产品 (父类可以是接口或者抽象类,我们定义一个抽象类,一个接口)
定义抽象产品A:
    /// <summary>/// 抽象产品A/// </summary>public abstract class Car{public abstract void Run();}

抽象产品B:

    /// <summary>/// 抽象产品B/// </summary>public interface IBus{void Run();}


2、定义实体产品

实体产品A1:

    /// <summary>/// 实体产品A1/// </summary>public class BMWCar:Car{public override void Run(){Console.WriteLine("宝马轿车在行驶!");}}

实体产品A2:

    /// <summary>/// 实体产品A2/// </summary>public class BenzCar:Car{public override void Run(){Console.WriteLine("奔驰轿车在行驶!");}}


实体产品B1:

    /// <summary>/// 实体产品B1/// </summary>public class BMWBus : IBus{public void Run(){Console.WriteLine("宝马大汽车");}}

 

实体产品B2:

    /// <summary>/// 实体产品B2/// </summary>public class BenzBus : IBus{public void Run(){Console.WriteLine("奔驰大汽车");}}


我们甚至可以再建N个A3,A4,B3,B4.................... 此处省略。

 

3、定义抽象工厂

众所周知现实生活中工厂都是生产产品的,在我们这 工厂是用来生产类的对象的。抽象工厂就是用来定义 工厂应该做什么的。相当于工厂接口规定工厂应该做什么。同时创建实体工厂对象,创建对象可以用反射,本例中只是为了说明抽象工厂的思想和具体实现。我们直接使用配置文件来读取。

    /// <summary>/// 抽象工厂/// </summary>public abstract class AbstractFactory{public static AbstractFactory CreateFactory(string strType){AbstractFactory factory = null;switch (strType){case "BMW":factory = new BMWFactory();break;case "Benz":factory = new BenzFactory();break;}return factory;}/// <summary>/// 抽象方法 创建Car对象/// </summary>/// <returns></returns>public abstract Car CreateCar();/// <summary>/// 创建BUS/// </summary>/// <returns></returns>public abstract IBus CreateBus();}

 

 

4、定义实体工厂

 实体工厂1:

   /// <summary>/// 实体工厂1/// </summary>public class BMWFactory:AbstractFactory{public override Car CreateCar(){return new BMWCar();}public override IBus CreateBus(){return new BMWBus();}}

实体工厂2:

    /// <summary>/// 实体工厂2/// </summary>public class BenzFactory : AbstractFactory{public override Car CreateCar(){return new BenzCar();}public override IBus CreateBus(){return new BenzBus();}}

 

5、客户端调用

从 最上面的图我们可以看出客户端调用抽象工厂的代码只关注抽象工厂和抽象产品,而不关注具体的实现类。如下图:

 由此我们得出抽象工厂的定义:

提供一个创建一系列相关或相互依赖对象的接口,无需指定它们具体的类
 static void Main(string[] args){AbstractFactory factory = AbstractFactory.CreateFactory("Benz");Car car = factory.CreateCar();car.Run();IBus bus = factory.CreateBus();bus.Run();}

 

直接上代码:

点我下载

 

 

转载于:https://www.cnblogs.com/suizhouqiwei/archive/2012/06/26/2563332.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/482534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nature封面:只低一毫米,时间也会变慢!叶军团队首次在毫米尺度验证广义相对论...

来源&#xff1a;凹非寺作者&#xff1a;晓查 明敏你知道吗&#xff1f;在地球上&#xff0c;楼层越低&#xff0c;时间过得越慢。这可不是玄学&#xff0c;而是爱因斯坦广义相对论预言的时间膨胀效应&#xff1a;引力越大&#xff0c;时间越慢。△ 在不同高度差上验证时钟变快…

SQL 与 ORACLE 的比较

最近参加了一个ORACLE的培训&#xff0c;ORACLE与平日惯用的SQL SERVER果然有很大不同&#xff0c;在网上搜索了一下转了这篇比较SQL与ORACLE的帖子&#xff0c;总体上感觉SQL SERVER使用更加便捷&#xff0c;人性化&#xff0c;在网上的资料支持很丰富ORACLE更加专家一些&…

DARPA可解释AI研究(XAI计划)的4年回顾与经验总结

来源&#xff1a;智源社区作者&#xff1a;David Gunning, Eric Vorm, Jennifer Yunyan Wang, Matt Turek编译&#xff1a;牛梦琳摘要&#xff1a;从项目管理人员和评估人员的角度&#xff0c;对国防高级研究计划局&#xff08;DARPA&#xff09;的可解释人工智能&#xff08;X…

03.Mybatis优化

对动态代理方式的代码进行进一步优化: 1.将conf.xml文件中对数据库的配置信息以db.properties的形式抽离出来 drivercom.mysql.jdbc.Driver urljdbc:mysql://localhost:3306/person?serverTimezoneUTC usernameroot passwordroot <configuration><properties resourc…

​从ASML年报看半导体产业的未来

来源&#xff1a;半导体行业观察在前几天的文章《光刻机巨头ASML的十年变迁》中&#xff0c;笔者梳理了ASML近10年来的财报数据&#xff0c;介绍了其EUV/DUV光刻机出货量、年销售额、研发投入以及各地区的销售情况等。近日&#xff0c;ASML又公布了2021年年报&#xff0c;我们一…

04.MyBatis别名的设置和类型转换器

别名的设置:(别名不区分大小写): 设置单个别名: <configuration><properties resource"db.properties" /><typeAliases><!-- 设置单个别名 --><typeAlias type"com.offcn.entity.Person" alias"person"/><type…

史上首次,强化学习算法控制核聚变登上Nature:DeepMind让人造太阳向前一大步...

来源&#xff1a;机器之心过去三年&#xff0c;DeepMind 和瑞士洛桑联邦理工学院 EPFL 一直在进行一个神秘的项目&#xff1a;用强化学习控制核聚变反应堆内过热的等离子体&#xff0c;如今它已宣告成功。DeepMind研究科学家David Pfau在论文发表后感叹道&#xff1a;「为了分享…

Memcached 使用 及.NET客户端调用

memcached安装: 1 解压缩文件到c:\memcached 2 命令行输入 c:\memcached\memcached.exe -d install 3 命令行输入 c:\memcached\memcached.exe -d start &#xff0c;该命令启动 Memcached &#xff0c;默认监听端口为 11211 注&#xff1a; 如果出现如下错误 “ failed to in…

机器人流程自动化技术的新发展

来源&#xff1a;学习时报作者&#xff1a;李蕾蓬勃发展的数字经济&#xff0c;是全球新一轮科技进步的产物&#xff0c;直接受到新兴数字技术与智能技术的驱动。机器人流程自动化技术&#xff08;简称“RPA”&#xff09;&#xff0c;是近些年获得快速发展与广泛应用的重要智能…

运算符 优先级 结合性

&#xff23;语言的运算符可分为以下几类&#xff1a; 1. 算术运算符:用于各类数值运算。包括加()、减(-)、乘(*)、除(/)、求余(或称模运算&#xff0c;%)、自增()、自减(--)共七种。 2. 关系运算符:用于比较运算。包括大于(>)、小于(<)、等于()、 大于等于(&g…

05.MyBtais两种取值符号以及输入参数和输出参数

输入参数&#xff1a;parameterType 两种取值符号的异同 1.类型为简单类型(8个基本类型string) 不同点: a.#{任意值}&#xff0c;${value} 其中的标识符只能是value b. #{}自动给String类型加上单引号(‘’) (自动类型转换) ${} 原样输出&#xff0c;适合于动态排序 &#xff0…

论人工智能历史、现状与未来发展战略

来源&#xff1a;《学术前沿》作者&#xff1a;郭毅可人工智能问世60多年来&#xff0c;承载着人类对自己的智慧的无限自信。在这样的自信下&#xff0c;人工智能发展到了今天&#xff0c;人们在追求机器从事尽可能多的智力劳动的路上走得很快&#xff0c;也很远。今天人工智能…

PHP 开发者大会

PHPCON 2019 开发者大会(上海)2019.8.10-8-11 郭新华,和陈雷给我留下的影响很大 再看下天气,利奇马台风,都坐满了,来的都是真爱. Swoole 的韩天峰开始演讲,感觉是程序员标准的样子,哈哈哈 2345 的高旭 讲公司用swoole 的架构 鸟哥因为台风问题没来成,搞了个直播,哈哈哈,感觉很…

IEEE Fellow杨铮:打破「视觉」垄断,无线信号为 AI 开启「新感官」

来源&#xff1a;AI科技评论作者&#xff1a;陈彩娴编辑&#xff1a;岑峰2020年年初疫情刚开始时&#xff0c;清华大学的官方号曾祭出一篇题为《清华教师升级「十大神器」&#xff0c;上课力满格》的推文&#xff0c;讲述了软件学院某老师如何居家办公、探索出一套防止学生偷懒…

对于量子计算来说,99%的准确度足够吗?

UNIVERSITY OF NEW SOUTH WALES来源&#xff1a;IEEE电气电子工程师来自荷兰代尔夫特理工大学&#xff08;Delft University of Technology&#xff09;、日本理化学研究所&#xff08;Riken&#xff09;和悉尼新南威尔士大学&#xff08;UNSW&#xff09;的研究团队在硅中开发…

JavaScript每日学习日记(1)

8.11.2019 1. lastIndexOf() 方法从尾到头进行检索。 2. 有三种提取部分字符串的方法&#xff1a; 2.1 slice(start, end) 如果某个参数为负&#xff0c;则从字符串的结尾开始计数。如果省略第二个参数&#xff0c;则该方法将裁剪字符串的剩余部分。 2.2 substring(start, end…

人工智能将如何改变芯片设计

来源&#xff1a;ScienceAI编译&#xff1a;绿萝摩尔定律的终结正在逼近。工程师和设计师只能将晶体管小型化并尽可能多地封装到芯片中。因此&#xff0c;他们正在转向其他芯片设计方法&#xff0c;将 AI 等技术融入到设计过程中。例如&#xff0c;三星正在将人工智能添加到其内…

网络编程 总结

软件开发架构 c/s client/server b/s broswer/server ps:b/s本质上也是c/s架构 OSI七层协议 应用层 表示层 会话层 传输层 网络层 数据链路层 物理连接层 物理连接层 传输二进制的数据 数据链路层(以太网协议) 1.规定了二进制数据的分组依据 2.规定了每台计算机都必须有一块网…

计算机科学家证明,为什么更大的神经网络可以做得更好

来源&#xff1a;ScienceAI编辑&#xff1a;萝卜皮我们的物种很大程度上归功于对生的拇指。但如果进化给了我们额外的拇指&#xff0c;事情可能不会有太大改善。每只手一个拇指就足够了。神经网络并非如此&#xff0c;这是执行类人任务的领先人工智能系统。随着他们变得更大&am…

解决安装IIS时提示找不到zClientm.exe文件的问题

今天在安装IIS出现找不到zClientm.exe文件&#xff0c;还以为是下载IIS有问题&#xff0c;头大了。以下是解决方案。在组件安装向导中顺着[附件和工具]--[游戏]一路点击下去,惊喜地发现里面有一栏[Internet游戏]&#xff0c;把勾去掉&#xff0c;重新安装IIS就OK。但是有网友提…