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.问题: 什么是简单工厂:它的实现方式是由一个工厂类根据传入的参数,动态 ...
随机推荐
- Bootstrap——一款超好用的前端框架
前 言 Bootstrap Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的,用于开发响应式布局.移动设备优先的 WEB 项目.Bootstrap在JQuery的基础上进 ...
- node.js的generic-pool与mysql结合,mysql连接池
var generic_pool = require('generic-pool'); var pool = generic_pool.Pool({ name: 'mysql', ma ...
- 最详细的cookie和浏览隐私之间的关系
本文所说的"cookie",指的是浏览器相关的 cookie(也叫"HTTP cookie"). 浏览器 cookie 的主要功能是:帮助网站保存一些小片段的信 ...
- 使用docker部署standalone cinder
| 版权:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.如有问题,可以邮件:wangxu198709@gmail.com 背景 OpenSta ...
- Merge Two Binary Trees
Given two binary trees and imagine that when you put one of them to cover the other, some nodes of t ...
- Ansible(三) - playbook简介
Ⅰ. Playbook介绍 Playbook其实就是ansible的一个任务列表,各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个.在顺序运行某playb ...
- 全方位解读及介绍windows网络安全及常见攻击方式
本来我就是来逛逛论坛的,可是看到前面有位一样是干网络安全的同行,留下来过的痕迹,发了一篇相对不错的文章,我寻思咱既然来这一趟,也不能显得就比别人差啊.所以我也就写了这一片不算成熟小文章,望各位共勉之哈 ...
- 第9期Unity User Group Beijing图文报道:《Unity实战经验分享》
时间来到了金秋九月,北京UUG活动也来到了第九期.本次活动的主题为<Unity实战经验分享>,为此我们邀请了3位资深的行业大神.这次我们仍然在北京市海淀区丹棱街5号微软大厦举行活动,在这里 ...
- 【学习】jquery.placeholder.js让IE浏览器支持html5的placeholder
type为text或password的input,其在实际应用时,往往有一个占位符,类似这样的: 在没有html5前,一般写成value,用js实现交互,文本框获得焦点时,提示文字消失,失去焦点时,文 ...
- 语音识别完成诗句的查询功能,iOS AVSpeechSynthesis语音输出结果的诗歌APP
前言 当前的APP的查询都是使用手动输入,不仅效率低,而且查询的语句的限制比较大,不能够方便的扩展. 如果能方便的扩展查询语句,那么APP的使用就会有很大的灵活性.可以设计各种问句和语句,可以方便的和 ...