C#设计模式--简单工厂模式
简单工厂模式是属于创建型模式,但不属于23种GOF设计模式之一。
举一个例子:一个公司有不同的部门,客户根据需要打电话到不同的部门。客户相当于上端,不同部门相当于下端。不使用简单工厂模式来实现的例子如下:
#region 上端
class Program
{
static void Main(string[] args)
{
Console.WriteLine("********不使用工厂方法******");
HRDept hr = new HRDept();
hr.Call();
TechnologyDept technology = new TechnologyDept();
technology.Call();
Console.ReadKey();
}
}
#endregion
#region 下端
class HRDept
{
public void Call()
{
Console.WriteLine("这是人事部");
}
}
class TechnologyDept
{
public void Call()
{
Console.WriteLine("这是技术部");
}
}
#endregion
从这个例子可以发现客户需要找一个部门,就必须知道那个部门的电话号码。即上端直接依赖于下端。 每回都需要去new一下,完全把下端类暴露给上端。并且下端改变,上端必须改变。而在我们的实际生活中,客户并不知道每个部门的具体号码,都是打电话到前台,让前台将电话转到对应部门。而前台就相当于一个简单工厂。HRDept类和TechnologyDept类都有Call()方法,所以可以定义一个接口,声明这个方法。
#region 上端
class Program
{
static void Main(string[] args)
{
Console.WriteLine("********工厂方法******");
IDept hr = SimpleFactory.CreateInstance("HR");
hr.Call();
IDept technology = SimpleFactory.CreateInstance("Technology");
technology.Call();
Console.ReadKey();
}
}
#endregion
#region 下端
class SimpleFactory
{
public static IDept CreateInstance(string name)
{
switch (name)
{
case "HR":
return new HRDept();
case "Technology":
return new TechnologyDept();
default:
throw new Exception("部门名称错误");
}
}
}
interface IDept
{
void Call();
}
class HRDept: IDept
{
public void Call()
{
Console.WriteLine("这是人事部");
}
}
class TechnologyDept: IDept
{
public void Call()
{
Console.WriteLine("这是技术部");
}
}
#endregion
由上可以发现简单工厂,创建一个工厂类,负责对象的创建,而不是在上端使用的地方直接创建。面向抽象,屏蔽细节。 缺陷:把对象创建转移到工厂,上端不关心细节,修改类的时候需要修改工厂方法。工厂方法自身高耦合,矛盾转移,将上端与下端的耦合转移到工厂方法,严重违背单一职责。
简单工厂:创建一个工厂类,负责对象的创建,而不是在上端使用的地方直接创建。
缺陷:把对象创建转移到工厂,上端不关心细节,修改类的时候需要修改工厂方法。工厂方法自身高耦合,矛盾转移,将上端与下端的耦合转移到工厂方法,严重违背单一职责。
工厂类完成对象的创建。在使用时只需要调用工厂类的CreateInstance()方法,通过传递不同参数,创建不同的类。
简单工厂的升级
1.简单工厂+配置文件
代码示例:
工厂类
class SimpleFactory
{
//简单工厂+配置文件
//添加引用System.Configuration.dll
private static string RaceTypeConfig = ConfigurationManager.AppSettings["DeptConfig"];
public static IDept CreateInstanceConfig()
{
switch (RaceTypeConfig)
{
case "HR":
return new HRDept();
case "Technology":
return new TechnologyDept();
default:
throw new Exception("部门名称错误");
}
} }
配置文件
<appSettings>
<add key="DeptConfig" value="HRDept"/>
</appSettings>
2.简单工厂+配置文件+反射
代码示例:
工厂类
class SimpleFactory
{
//简单工厂+配置文件+反射
private static string RaceTypeReflect = ConfigurationManager.AppSettings["DeptReflect"];
public static IDept CreateInstanceReflect()
{
string assemblyName = RaceTypeReflect.Split(',')[];
string typeName = RaceTypeReflect.Split(',')[];
return (IDept)(Activator.CreateInstance(assemblyName, typeName).Unwrap());
}
}
配置文件
<appSettings>
<add key="DeptReflect" value="SimpleFactory,SimpleFactory.HRDept"/>
</appSettings>
C#设计模式--简单工厂模式的更多相关文章
- 3. 星际争霸之php设计模式--简单工厂模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- Golang设计模式—简单工厂模式(Simple Factory Pattern)
Golang设计模式--简单工厂模式 背景 假设我们在做一款小型翻译软件,软件可以将德语.英语.日语都翻译成目标中文,并显示在前端. 思路 我们会有三个具体的语言翻译结构体,或许以后还有更多,但现在分 ...
- C++设计模式——简单工厂模式
简单工厂模式(Simple Factory Pattern) 介绍:简单工厂模式不能说是一个设计模式,说它是一种编程习惯可能更恰当些.因为它至少不是Gof23种设计模式之一.但它在实际的编程中经常被用 ...
- 深入浅出设计模式——简单工厂模式(Simple Factory)
介绍简单工厂模式不能说是一个设计模式,说它是一种编程习惯可能更恰当些.因为它至少不是Gof23种设计模式之一.但它在实际的编程中经常被用到,而且思想也非常简单,可以说是工厂方法模式的一个引导,所以我想 ...
- 设计模式 | 简单工厂模式(static factory method)
按理说应该把书全都看完一遍,再开始写博客比较科学,会有比较全面的认识. 但是既然都决定要按规律更新博客了,只能看完一个设计模式写一篇了. 也算是逼自己思考了,不是看完就过,至少得把代码自己都敲一遍. ...
- Yii2设计模式——简单工厂模式
除了使用 new 操作符之外,还有更多的制造对象的方法.你将了解到实例化这个活动不应该总是公开进行,也会认识到初始化经常造成"耦合"问题. 应用举例 yii\db\mysql\Sc ...
- 设计模式 — 简单工厂模式(staticFactory)
这篇博文介绍简单工厂模式,设计模式并不是固定的二十三种,不同的书介绍的可能有出入,这篇介绍的简单工厂模式在有些书上就忽略不介绍了.设计模式是一套被反复使用的.多数人知晓的.经过分类编目的.代码设计经验 ...
- Yii2 设计模式——简单工厂模式
除了使用 new 操作符之外,还有更多的制造对象的方法.你将了解到实例化这个活动不应该总是公开进行,也会认识到初始化经常造成“耦合”问题. 应用举例 yii\db\mysql\Schema 中: // ...
- 在商城系统中使用设计模式----简单工厂模式之在springboot中使用简单工厂模式
1.前言: 不了解简单工厂模式请先移步:在商城中使用简单工厂.在这里主要是对springboot中使用简单工厂模式进行解析. 2.问题: 什么是简单工厂:它的实现方式是由一个工厂类根据传入的参数,动态 ...
随机推荐
- kvm 虚拟化的使用
kvm原理:基于内核空间虚拟化,加载内核模块,来做到虚拟化(简称内核空间).基于qemu连接内核,driver驱动连接kvm的API接口(简称用户空间): hypervisor 管理硬件设备,传统的虚 ...
- MapReduce极简教程
一个有趣的例子 你想数出一摞牌中有多少张黑桃.直观方式是一张一张检查并且数出有多少张是黑桃? MapReduce方法则是: 给在座的所有玩家中分配这摞牌 让每个玩家数自己手中的牌有几张是黑桃,然后 ...
- BackTrack 5无线网卡混杂模式设置
用ifconfig查看网络设备 主机无线网卡名称一般为wlan0,USB网卡一般为wlan1 虚拟机中USB网卡一般无法自动识别,可以用ifconfig wlan1 up启用 用ifconfig wl ...
- /MD、/MT、/LD( 使用 多线程版本 运行时库的C runtime library)
/MD./MT./LD(使用运行时库)(微软官网解释) Visual C++ 编译器选项 /MD./ML./MT./LD 区别 指定与你项目连接的运行期库 /MT多线程应用程序 /Mtd多线程应用程序 ...
- BCB中AnsiString类方法小结
AnsiString类是BCB中最常见类之一,了解它对以后深入学习BCB大有帮助. 介绍AnsiString类之前,先要介绍一些背景知识.VCL(Visual Component Library 可视 ...
- 对Item中定时器的理解
一.Diamond介绍 Diamond主要提供持久配置的发布和订阅服务,最大特点是结构简单,稳定可靠. 主要的使用场景:TDDL使用Diamond动态切换数据库,动态扩容等:业务使用Diamond推送 ...
- 约会安排HDU - 4553
寒假来了,又到了小明和女神们约会的季节. 小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复"呵呵",所以,小明的最爱就是和女神们约会.与此同时,也有很多基 ...
- 读Zepto源码之Fx模块
fx 模块为利用 CSS3 的过渡和动画的属性为 Zepto 提供了动画的功能,在 fx 模块中,只做了事件和样式浏览器前缀的补全,没有做太多的兼容.对于不支持 CSS3 过渡和动画的, Zepto ...
- fitnesse - Variables and Symbols
fitnesse - Variables and Symbols 2017-09-30 目录 1 Variables(静态变量) 1.1 定义及使用 1.2 Variable作用域 1.2. ...
- zoj2277 The Gate to Freedom
传送门 题目大意,对n, 求n^n的最左边一位数的大小: ...