C#设计模式--抽象工厂模式(创建型模式)
一.抽象工厂模式:
在工厂模式中具体的产品和具体的工厂是一一对应的,一个工厂只能生产一种产品,结构单一,例如小米公司刚开始是只生产小米手机,但是伴随着公司的发展,他们需要生产不同型号的手机,也会生产路由器,小米电视等等,那么工厂方法模式已不能满足业务的需求了,此时我们就需要抽象工厂模式,即一个工厂可以生产多种产品。
抽象产品:负责定义抽象工厂生成的产品的接口,在本例中有两个抽象产品类,分别是手机和电视的抽象类
- 电视(抽象类)
- watchTV
- 手机(抽象类)
- 打电话
- 电视(抽象类)
public abstract class IMobilePhone
{
public abstract void dial();
}
public abstract class ITelevision
{
public abstract void watchTV();
}
抽象产品类
- 具体产品:负责实现抽象类的产
public class MobilePhone : IMobilePhone
{
private string name;
public MobilePhone(string name)
{
this.name = name;
Console.WriteLine("制作手机"+name);
}
public override void dial()
{
Console.WriteLine("使用" + name+"打电话");
}
}
public class Television : ITelevision
{
private string name;
public Television(string name)
{
this.name = name;
Console.WriteLine("制作电视"+name);
}
public override void watchTV()
{
Console.WriteLine("通过"+name+"看电视");
}
}
具体产品类
- 抽象工厂类抽象工厂角色是负责定义用于生成抽象产品的接口
public abstract class Factory
{
public static Factory getFactory(string classname)
{ Factory factory = null;
try
{
factory = (Factory)Assembly.Load("设计模式").CreateInstance("设计模式." + classname);
}
catch (Exception e)
{
Console.WriteLine("没有找到 " + classname + "类。");
}
return factory;
}
public abstract MobilePhone createMobilePhone(String type);
public abstract Television createTelevision(String type);
}
抽象工厂类
- 具体工厂类:实现抽象工厂的抽象方法生成产品
public class XiaoMiFactory:Factory
{
public override MobilePhone createMobilePhone(string type)
{
return new MobilePhone(type);
}
public override Television createTelevision(string type)
{
return new Television(type);
}
}
具体工厂类
下面实际测试一下:
static void Main(string[] args)
{
Factory factory = Factory.getFactory("XiaoMiFactory");
IMobilePhone mobilePhone1 = factory.createMobilePhone("小米2");
IMobilePhone mobilePhone2 = factory.createMobilePhone("小米5"); ITelevision television1 = factory.createTelevision("小米电视2");
ITelevision television2 = factory.createTelevision("小米电视3"); mobilePhone1.dial();
mobilePhone2.dial(); television1.watchTV();
television2.watchTV();
Console.ReadKey();
}
输出信息:
- 制作手机小米2
- 制作手机小米5
- 制作电视小米电视2
- 制作电视小米电视3
- 使用小米2打电话
- 使用小米5打电话
- 通过小米电视2看电视
- 通过小米电视3看电视
C#设计模式--抽象工厂模式(创建型模式)的更多相关文章
- 设计模式02: Abstract Factory 抽象工厂(创建型模式)
Abstract Factory 抽象工厂(创建型模式) 常见的对象创建方法: //创建一个Road对象 Road road=new Road(); new的问题: -实现依赖 ...
- Abstract Factory 抽象工厂(创建型模式)
1.常规的对象创建方法(以更换QQ空间主题为例) (这里的常规对象指的是由于业务需求,当前实例化的对象有可能被其他相似的对象(有着共同的特性)所取代,例如更换手机铃声:一首歌取代另一首歌(词,曲,和声 ...
- 2.Abstract Factory 抽象工厂(创建型模式)之简单工厂
简单工厂 1.只有一个工厂(具体的,没有抽象) 2.只生产一种产品(抽象的产品) 3.这种产品可以有多种具体产品类型(派生) 代码实现 class Program { static void Main ...
- FactoryMethod工厂方法模式(创建型模式)
1.工厂方法模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只 ...
- Prototype原型模式(创建型模式)
1.原型模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只有一 ...
- 工厂方法模式——创建型模式02
1. 简单工厂模式 在介绍工厂方法模式之前,先介绍一下简单工厂模式.虽然简单工厂模式不属于GoF 23种设计模式,但通常将它作为学习其他工厂模式的入门,并且在实际开发中使用的也较为频繁. (1 ...
- 设计模式(五):PROTOTYPE原型模式 -- 创建型模式
1.定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.适用场景 原型模式的主要思想是基于现有的对象克隆一个新的对象出来,一般是有对象的内部提供克隆的方法,通过该方法返回一个对 ...
- 设计模式(二): BUILDER生成器模式 -- 创建型模式
1.定义 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 2.适用场景 1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式 ...
- java架构之路-(设计模式)五种创建型模式之单例模式
设计模式自身一直不是很了解,但其实我们时刻都在使用这些设计模式的,java有23种设计模式和6大原则. 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可 ...
- 设计模式(一): abstract factory抽象工厂模式 -- 创建型模式
1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.适用场景 1.一个系统要独立于它的产品创建.组合和表示. 2.一个系统要由多个产品系列中的一个来配置. 3.当你要 ...
随机推荐
- JDK的详细安装步骤
jdk的安装 一.下载jdk安装包,可以从https://www.cnblogs.com/zyx110/p/10799387.html中查找并下载 二.双击打开jdk安装包,一路傻瓜式安装,点击下一步 ...
- c#缓存帮助类
public static class CacheHelper { static object _lockObj = new object(); private static Dictionary&l ...
- day20 模块 collections time sys os
1.模块 1. 模块的定义:我们把装有特定功能的代码进行归类的结果.我们目前写的所有py文件都是模块 2. 引入模块的方式: 1.import 模块名 2.from xxx import 模块名 2. ...
- Web开发中FormData对象的使用
参考: FormData 对象的使用 - Web API 接口 | MDN
- Java学习笔记day04_数组
1.switch case switch语句中表达式的数据类型是有要求的: JDK 1.0 ~ 1.4 , 数据类型接受byte, short, int, char JDK 1.5 , 数据类型接受b ...
- 基于webpack的vue项目路径别名
在vue的项目里,我们可以使用../这样的相对路径的方式引用不同目录的组件: import userinfo from '../../../components/userinfo.vue'; 使用.. ...
- swagger demo code
//Application 开启注解 @EnableSwagger2public class Application { public static void main(String[] args) ...
- 性能测试工具LoadRunner23-LR之Analysis 性能分析
一.图表分析 1.Average Transaction Response Time(事务平均响应时间) “事务平均响应时间”显示的是测试场景运行期间的每一秒内事务执行所用的平均时间,通过它可以分析测 ...
- [转]jQueryUI中Datepicker(日历)插件的介绍和使用
http://jqueryui.com/datepicker/ 本文转自:http://blog.csdn.net/redarmy_chen/article/details/7400571 jQuer ...
- ORACLE SQL 实现IRR的计算
一.IRR计算的原理: 内部收益率(Internal Rate of Return (IRR)),就是资金流入现值总额与资金流出现值总额相等.净现值等于零时的折现率. 用公式 标识:-200+[30/ ...