简单工厂设计模式(Simple Factory Design Pattern)
【引言】最近在Youtub上面看到一个讲解.net设计模式的视频,其中作者的一个理解让我印象很深刻:所谓的设计模式其实就是运用面向对象编程的思想来解决平时代码中的紧耦合,低扩展的问题。另外一点比较有见解的是,区分了设计模式(Design Pattern),结构模式(Architecture Pattern),架构类型(Architecture Style). 如下图所示
Design Pattern:是基于代码层面的,就是针对解决功能模块之间的问题而采用恰当的设计模式,比如依赖注入,简单工厂,适配器模式等等,但是这些有一个功能点就是我们常说设计模式往往都是立足于代码层面,从来没有听说过我的整个应用程序用的是什么模式(听着就觉得很诡异)。
Architecture Pattern: 是基于功能与概念性层面的。对于架构模式我们应该着眼去功能模块,层级之间的结构关系来考虑采用恰当的方式。
Architecture Style:则又是基于架构模式(Architecture Pattern)上更高级别的概念性层面的东西,主要着眼去客户端与服务端之间的关系来考虑设计。
【简单工厂模式】
简单工厂模式是一个在开发中常用的设计模式,主要使用在于解决具有关联性但不同类初始化紧耦合的问题。这么说,可能大多数人不是很理解。下面就借用上面提到的视频中的一个演示的代码做一个简单的说明。
以下是一个常见类设计上的紧密耦合的例子:我们实现白领,工人,企业主三个实体类,在客户端(Winform/WPF/Console)我们需要访问这三个类实例来调用各自的上税的方法,因为不同的职业缴纳的税费和比例不同,所以上税的实现其实也不同。
问题1:违反Open Close Principle(开放闭合原则)。如果我们需要添加新的公务员实体类,就需要修改客户端,首先添加对公务员实体类的引用,其次还需要扩展IF ELSE 语句块。如果是一个大型的应用程序, 你就需要去改动所有原有实体类引用的地方,以及同样的IF ELSE语句,那将会是非常糟糕的事情。其实这就是典型的客户端初始化实体类的紧耦合的例子,客户端包含了具体了不同实体类的引用,而且根据条件初始化不同的实体类。
问题2:白领与工人,企业主甚至公务员实体类之间虽然是不同的类模式但是却具有相关性,所以在上税这一个共性行为上就应该应用最典型的多态实现。
如何解决上诉问题? ---简单工厂模式
我们可以调整类的设计图如下
1. 采用继承和虚方法分离白领,工人与企业主实体类之间的共性和不同,大致代码如下:
public class Citizen
{
public string Name { get; set; } public virtual double PayTax()
{
return ;
}
}
每个不同的实体类如白领类可以自己重写PayTax的逻辑,然后对于如果需要扩展新的类如公务员类,只需要添加新的类实现,而不需要去改动客户端现有的代码--开放闭合原则
2. 工厂类的代码大致如下:对于如果需要扩展新的实体类如公务员类只在工厂类中初始化实体类方法中添加新的类即可。这样对于新加扩展功能不需要去修改已有的逻辑,而是新加实现这便是符合开放闭合原则,其次移除了客户端的原有的业务逻辑的IF ELSE 判断,客户端与业务层之间仅仅依赖一个基类(抽象),而不在依赖于具体的实现(白领,工人,企业主实体类),这样也实现了客户端与业务层之间的解耦。
//Design Pattern: Simple Factory Pattern
public static class CitizenFactory
{
private static Dictionary<string, Citizen> _citizen = new Dictionary<string, Citizen>();
public static Citizen CreateInstance(string typeStr)
{
if (_citizen.Count == )
{
_citizen.Add("白领", new 白领());
_citizen.Add("工人", new 工人());
_citizen.Add("企业主", new 企业主());
}
return _citizen[typeStr];
}
}
这就是简单工厂模式所能解决的问题,理解了也就知道在什么情况下我们可以使用简单工厂模式来解决这类问题。
【总结】:简单工厂模式主要是为了解决类构造和初始化与客户端之间的紧密耦合和依赖,拆分IF ELSE 等分支判断难的问题。一般情况下如果系统中实体类之间存在关联性,以及客户端逻辑中存在过多分支判断初始化类对象逻辑,可以采用简单工厂模式来解耦。在平时采用简单工厂模式的例子也有很多,比如在为了实现不同DataBase(SQL/MYSQL/ACCESS)接口扩展,调用不同的web服务都能看到工厂模式的运用。
DEMO:关于这里我用一个类似的案例写了两个版本的演示例子,一个是紧密耦合修改前的代码,一个是运用简单工厂模式以后的代码,有兴趣的同学可以在载来练习练习。
项目结构:
红色标注(.SFP)结尾的为调整后的代码,非红色标注的修改前的代码。
SouceCode:http://files.cnblogs.com/files/georgeHeaven/01.SimpleFactoryPattern.zip
简单工厂设计模式(Simple Factory Design Pattern)的更多相关文章
- 【设计模式】简单工厂模式 Simple Factory Pattern
简单工厂模式Simple Factory Pattern[Simple Factory Pattern]是设计模式里最简单的一个模式,又叫静态工厂模式[Static Factory Pattern], ...
- Golang设计模式—简单工厂模式(Simple Factory Pattern)
Golang设计模式--简单工厂模式 背景 假设我们在做一款小型翻译软件,软件可以将德语.英语.日语都翻译成目标中文,并显示在前端. 思路 我们会有三个具体的语言翻译结构体,或许以后还有更多,但现在分 ...
- 设计模式之简单工厂模式Simple Factory(四创建型)
工厂模式简介. 工厂模式专门负责将大量有共同接口的类实例化 工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类. 工厂模式有三种形态: 1.简单工厂模式Simple Factory ...
- 大白话简单工厂模式 (Simple Factory Pattern)
大白话简单工厂模式 (Simple Factory Pattern) 从买车经历说起 毕业两年,码农张小两口无法忍受挤公交,凌晨起床抢火车票的痛苦,遂计划买车.逛了多家4S店,最终定下日产某车型的轿车 ...
- 设计模式的征途—2.简单工厂(Simple Factory)模式
工厂模式是最常用的一种创建型模式,通常所说的工厂模式一般是指工厂方法模式.本篇是是工厂方法模式的“小弟”,我们可以将其理解为工厂方法模式的预备知识,它不属于GoF 23种设计模式,但在软件开发中却也应 ...
- 设计模式--简单工厂(Simple Factory)
工厂模式是最常用的一种创建型模式,通常所说的工厂模式一般是指工厂方法模式.本篇是是工厂方法模式的“小弟”,我们可以将其理解为工厂方法模式的预备知识,它不属于GoF 23种设计模式,但在软件开发中却也应 ...
- 设计模式学习之简单工厂(Simple Factory,创建型模式)(1)
简单工厂(Simple Factory,创建型模式) 第一步: 比如我们要采集苹果和香蕉,那么我们需要创建一个Apple类和Banana类,里面各自有采集方法get(),然后通过main方法进行调用, ...
- 创建型模式(前引)简单工厂模式Simple Factory
一引出的原因(解决下面的问题) 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式. 在简单工厂模式 ...
- 简单工厂(Simple Factory)模式
工厂模式专门负责将大量有共同接口的类实例化.工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类.工厂模式有以下几种形态: 简单工厂(Simple Factory)模式 工厂方法(F ...
随机推荐
- Model Validation(模型验证)
Model Validation(模型验证) 前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/344 ...
- 活动图activity diagram
活动图activity diagram 系列文章 [UML]UML系列——用例图Use Case [UML]UML系列——用例图中的各种关系(include.extend) [UML]UML系列——类 ...
- python int异常 python isdigit
python int是python把任何类型转换成int类型的方法,但是你如果运用不好的话,会引发异常,但是python的str字符串转换方法运用起来倒是比较安全,它把任何对象转换成字符串类型都不会报 ...
- Area 使用
[ASP.NET MVC 小牛之路]08 - Area 使用 ASP.NET MVC允许使用 Area(区域)来组织Web应用程序,每个Area代表应用程序的不同功能模块.这对于大的工程非常有用,Ar ...
- MVC几种传值方式
一,Model public class Course { public int Id { get; set; } public string Name { get; set; } } public ...
- C#HTTP代理的实现之注册表实现
HTTP代理的实现形式,可以通过修改注册表项,然后启动浏览器来实现,也可以通过SOCKET通信,构造HTTP头实现.下面是关于注册表实现的方式. 注册表实现,只需要修改几个关键的注册表项就可以了. 第 ...
- linux学习心得之目录树开端与/etc(图文)
linux学习心得之目录树开端与/etc(图文) linux中“一切皆文件”,学习linux一年了,在学习过程中对目录树的一点心得,分享给大家,有不对的地方敬请斧正. 不多说了,先上图: 根目录: / ...
- grunt 上手
grunt 上手 开始上手 Grunt 和 grunt 插件都是通过 npm 安装, Node.js 包管理器管理的. Grunt 0.4.x 版本需要Node.js 版本号不低于0.8.0. 一.安 ...
- 一步步教你读懂NET中IL(附带图)
一步步教你读懂NET中IL(附带图) 接触NET也有1年左右的时间了,NET的内部实现对我产生了很大的吸引力,在msdn上找到一篇关于NET的IL代码的图解说明,写的挺不错的.个人觉得:能对这些底部的 ...
- SQL注入浅水攻防
啥是SQL注入(SQL Injection) 所谓SQL注入就是把SQL命令插入到表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造 (或影响 ...