简单工厂设计模式(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 ...
随机推荐
- Xcode开发和调试总结
Xcode是iOS开发主要的工具.IDE.关于Xcode的细枝末节,可以参考苹果的官方文档或者众多的说明.此文档主要涉及常用开发和调试注意事项,参考版本为Xcode 5.1.1. 目标设置: 在此,我 ...
- 2013.4.A
=-=最近简直忙疯了.....两眼泪汪汪的...一个星期又磨磨蹭蹭的刷了一套 1.java_c 题1 Java vs C++ [问题描述] Java和C++两种语言的辩手都可以相互争论数小时去证明他们 ...
- 设计适用于SOA的类型(二)
接着上次的,以扩展String类型为例,继续根据自己的使用习惯闭门造车! 这一次我重载了运算符 = 和 + ,我觉得这样更方便我的使用.首先先贴代码: /// <summary> // ...
- GoLang获取struct的tag
GoLang获取struct的tag内容:beego的ORM中也通过tag来定义参数的. 获取tag的内容是利用反射包来实现的.示例代码能清楚的看懂! package main import ( &q ...
- css兼容性问题的整理
css兼容性问题的整理 1.文字本身的大小不兼容.同样是font-size:14px的宋体文字,在不同浏览器下占的空间是不一样的,ie下实际占高16px,下留白3px,ff下实际占高17px,上留白1 ...
- windows下python web开发环境的搭建
windows下python web开发环境: python2.7,django1.5.1,eclipse4.3.2,pydev3.4.1 一. python环境安装 https://www.pyth ...
- 项目做成jar包
项目做成jar包 方法一.在eclipse3.1中把项目做成jar包步骤. 打包前的工作. 在项目下创建一个文件夹,名为META-INF,再在其下创建文件MANIFEST.MF 编辑的内容如下: Ma ...
- Lazy<T>
Lazy<T> 对象的创建方式,始终代表了软件工业的生产力方向,代表了先进软件技术发展的方向,也代表了广大程序开发者的集体智慧.以new的方式创建,通过工厂方法,利用IoC容器,都以不同的 ...
- Android分渠道打包(Python 3.4 实现)
Android批量打包实现有很多方式你可以用Ant,Maven或者Gradle.在处理多个Library和NDK编译的时候配置有些麻烦,且每个渠道都编译一次效率较低.如果没有复杂的分渠道编译需求,我们 ...
- Nhibernate1
Nhibernate随手记(1) 学习Nhibernate的萌芽 今早有群里有人问Nhibernate的问题,没学过,刚好来了兴趣,无意很快在园子里下载到了一本Nhibernate3.0的电子书,内容 ...