【引言】最近在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)的更多相关文章

  1. 【设计模式】简单工厂模式 Simple Factory Pattern

    简单工厂模式Simple Factory Pattern[Simple Factory Pattern]是设计模式里最简单的一个模式,又叫静态工厂模式[Static Factory Pattern], ...

  2. Golang设计模式—简单工厂模式(Simple Factory Pattern)

    Golang设计模式--简单工厂模式 背景 假设我们在做一款小型翻译软件,软件可以将德语.英语.日语都翻译成目标中文,并显示在前端. 思路 我们会有三个具体的语言翻译结构体,或许以后还有更多,但现在分 ...

  3. 设计模式之简单工厂模式Simple Factory(四创建型)

    工厂模式简介. 工厂模式专门负责将大量有共同接口的类实例化 工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类. 工厂模式有三种形态: 1.简单工厂模式Simple Factory ...

  4. 大白话简单工厂模式 (Simple Factory Pattern)

    大白话简单工厂模式 (Simple Factory Pattern) 从买车经历说起 毕业两年,码农张小两口无法忍受挤公交,凌晨起床抢火车票的痛苦,遂计划买车.逛了多家4S店,最终定下日产某车型的轿车 ...

  5. 设计模式的征途—2.简单工厂(Simple Factory)模式

    工厂模式是最常用的一种创建型模式,通常所说的工厂模式一般是指工厂方法模式.本篇是是工厂方法模式的“小弟”,我们可以将其理解为工厂方法模式的预备知识,它不属于GoF 23种设计模式,但在软件开发中却也应 ...

  6. 设计模式--简单工厂(Simple Factory)

    工厂模式是最常用的一种创建型模式,通常所说的工厂模式一般是指工厂方法模式.本篇是是工厂方法模式的“小弟”,我们可以将其理解为工厂方法模式的预备知识,它不属于GoF 23种设计模式,但在软件开发中却也应 ...

  7. 设计模式学习之简单工厂(Simple Factory,创建型模式)(1)

    简单工厂(Simple Factory,创建型模式) 第一步: 比如我们要采集苹果和香蕉,那么我们需要创建一个Apple类和Banana类,里面各自有采集方法get(),然后通过main方法进行调用, ...

  8. 创建型模式(前引)简单工厂模式Simple Factory

    一引出的原因(解决下面的问题) 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式. 在简单工厂模式 ...

  9. 简单工厂(Simple Factory)模式

    工厂模式专门负责将大量有共同接口的类实例化.工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类.工厂模式有以下几种形态: 简单工厂(Simple Factory)模式 工厂方法(F ...

随机推荐

  1. c#中关于sealed修饰类的性能提升的测试

    在clr var c#一书中,作者描述当用sealed修饰类时,可以提高系统性能而且建议大家也养成用sealed来修饰类的习惯.由于对性能二字比较敏感,所以本文先测试一下用sealed分别修饰和不修饰 ...

  2. Scala中的语言特性是如何实现的(3) -- Trait

    我的新博客地址:http://cuipengfei.me/blog/2013/10/13/scala-trait/ 我在Coursera上跟了一门叫做Functional Programming Pr ...

  3. 不是技术牛人,如何拿到国内IT巨头的Offer【转】

    转:http://blog.csdn.net/lsldd/article/details/13506263 不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰.看看这些牛人 ...

  4. 数组和Hash表

    数组和Hash表 当显示多条结果时,存储在变量中非常智能,变量类型会自动转换为一个数组. 在下面的例子中,使用GetType()可以看到$a变量已经不是我们常见的string或int类型,而是Obje ...

  5. 利用WCF与Android实现图片上传并传参

    利用WCF与Android实现图片上传并传参 最近做一个项目后端使用WCF接收Android手机拍照并带其它参数保存到服务器里:刚好把最近学习的WCF利用上,本以为是个比较简单的功能应该很好实现,没想 ...

  6. HashMap源码剖析

    HashMap源码剖析 无论是在平时的练习还是项目当中,HashMap用的是非常的广,真可谓无处不在.平时用的时候只知道HashMap是用来存储键值对的,却不知道它的底层是如何实现的. 一.HashM ...

  7. 我的Emacs折腾经验谈(一) 一些给新人的建议

    这几天都没有动力写mongodb的东西,我果然还是太懒了么~ 主要是没有一个系统的东西整理出来,加上我令人拙计的语言表达能力,这个坑只能慢慢再补了. 最近在折腾emacs这个东西,首先说我曾经算是个极 ...

  8. TCP中ECN的工作原理分析二(摘自:RFC3168)

    英文源:http://www.icir.org/floyd/ecn.html 发送端和接收端处理: The TCP Sender For a TCP connection using ECN, new ...

  9. POJ 1013 小水题 暴力模拟

    Counterfeit Dollar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 35774   Accepted: 11 ...

  10. Memcached 学习笔记(二)——ruby调用

    Memcached 学习笔记(二)——ruby调用 上一节我们讲述了怎样安装memcached及memcached常用命令.这一节我们将通过ruby来调用memcached相关操作. 第一步,安装ru ...