简单工厂设计模式(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 ...
随机推荐
- 编写简单的hashCode方法
为什么要编写hashCode方法 hashCode在平时不常自己去编写,但是在真正高质量的代码中却是必不可少的. 看看Java中的Object对hashCode方法的描述: 1.返回对象的哈希码,是为 ...
- MVC几种传值方式
一,Model public class Course { public int Id { get; set; } public string Name { get; set; } } public ...
- 一个吊丝android个人开发者的逆袭之路
转眼间,一年多过去了,记得我开发第一款android应用的时候,那是在前年的冬天,我本人是做java的,android的学习和开发完全是业余爱好,从前年上半年到前年下半年大约花了半年的业余时间把and ...
- 跨站请求伪造(Cross Site Request Forgery (CSRF))
跨站请求伪造(Cross Site Request Forgery (CSRF)) 跨站请求伪造(Cross Site Request Forgery (CSRF)) 跨站请求伪造(Cross Sit ...
- 1.C#基础学习笔记3---C#字符串(转义符和内存存储无关)
技术qq交流群:JavaDream:251572072 教程下载,在线交流:创梦IT社区:www.credream.com ------------------------------------- ...
- Python 3语法小记(五)字符串
Python 3 的源码的默认编码方式为 UTF-8 在Python 3,所有的字符串都是使用Unicode编码的字符序列. utf-8 是一种将字符编码成字节序列的方式.字节即字节,并非字符.字符在 ...
- Hadoop Streaming Command Details and Q&A
Hadoop Streaming Hadoopstreaming is a utility that comes with the Hadoop distribution. The utilityal ...
- Dom4j下载及使用Dom4j读写XML简介
sitinspring(如坐春风)原创,转载请注明作者及出处. 要使用dom4j读写XML文档,需要先下载dom4j包,dom4j官方网站在 http://www.dom4j.org/目前最新dom4 ...
- Java基础知识拾遗(一)
Java Threads 1. 创建线程的三种方法? 继承Thread类: 实现Runnable接口: 使用Executor框架创建一个线程池. 每个线程都有优先级(Thread.MAX_PRIORI ...
- 怎样清除SWAP里的文件
在vim 编辑一个文件时断了网,文件就留在SWAP里,但我再vim这个文件保存后,再打开时又提示SWAP里有这文件了,此时swapoff -a后再ls -al查看,把文件所在目录里*.swp结尾的文件 ...