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.问题: 什么是简单工厂:它的实现方式是由一个工厂类根据传入的参数,动态 ...
随机推荐
- Eclipse 多行复制并且移动失效
Eclipse 有个好用的快捷键 即 多行复制 并且移动 但是 用 Win7 的 电脑 的 时候 发现屏幕 在 旋转 解决方案: 打开Intel的显卡控制中心 把旋转 的 快捷键 进行更改 就好 ...
- nested exception is java.lang.IllegalArgumentException: Pointcut is not well-formed
在用AOP 的时候出现了如下的错误, 警告: Exception encountered during context initialization - cancelling refresh atte ...
- 【个人笔记】《知了堂》MySQL三种关系:一对一,一对多,多对多。
一对一:比如一个学生对应一个身份证号.学生档案: 一对多:一个班可以有很多学生,但是一个学生只能在一个班: 多对多:一个班可以有很多学生,学生也可以有很多课程: 一对多关系处理: 我们以学生和班级之间 ...
- "svn: E155010: 提交失败"问题解决
习惯于通过命令行操作svn,今天如往常一样提交代码: AnnytekiMacBook-Air:weiyibao Anny$ svn ci -m "code" 居然报错,如下: sv ...
- numpy学习整理
今天先整理到这里,剩下的下次再整理 1.改变形状: reshape()返回改变的数组形状,但无法改变源数组形状 resize() 可以改变源数组形状 ravel() 输出类似C数组的列表,和resha ...
- Java面向对象 集合(中)
Java面向对象 集合(中) 知识概要: (1)泛型的体系概念 (2)泛型的特点 (3)自定义泛型类 泛型的体系概念 泛型:JDK1.5版 ...
- 使用siege对web接口进行post方式的压力测试
为了达到压力测试的效果,需要申请一台线上机器,并且安装压力测试的工具siege. 安装新版siege.资料说yum安装的版本2.70对于post方式支持的不好,验证后发现请求可以正常发过去,但是打开d ...
- 在SQL中用正则表达式替换html标签(2)
由于数据库的一个表字段中多包含html标签,现在需要修改数据库的字段把html标签都替换掉.当然我可以通过写一个程序去修改,那毕竟有点麻烦.直接在查询分析器中执行,但是MS SQL Server并没有 ...
- 在Visual Studio 2013 中使用C++单元测试
本文主要介绍在Visual Studio 2013中对代码进行单元测试的方法,包含了两方面的内容:对已有的Dll文件进行单元测试,以及对已有的源文件进行单元测试. 1. VS2013对DLL文件的单元 ...
- 基于HTML5和WebGL的3D网络拓扑结构图
现在,3D模型已经用于各种不同的领域.在医疗行业使用它们制作器官的精确模型:电影行业将它们用于活动的人物.物体以及现实电影:视频游戏产业将它们作为计算机与视频游戏中的资源:在科学领域将它们作为化合物的 ...