简单工厂设计模式(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 ...
随机推荐
- NoSql数据库使用
NoSql数据库使用半年后在设计上面的一些心得 NoSql数据库这个概念听闻许久了,也陆续看到很多公司和产品都在使用,优缺点似乎都被分析的清清楚楚.但我心里一直存有一个疑惑,它的出现究竟是为了解决什么 ...
- iOS基础 - 定时器
1.可以完成的功能:每隔一段时间做一些固定的事情 2.创建定时器 1> 方法1 NSTimer *timer = [NSTimer timerWithTimeInterval:1.5 targe ...
- EF POWER TOOLS由数据库逆向CODE FIRST
EF POWER TOOLS由数据库逆向CODE FIRST 前言 利用db first的开发方式有很多可供选择的方案,一种可以用ado.net实体框架模型,由向导直接生成edmx,并生成数据库上下文 ...
- redis 中文存储乱码问题
在redis 中存储中文,读取会出现乱码(其实不是乱码,只是不是我们存的中文显示) redis> set test "我们" OK redis> get test &q ...
- SQLite数据库操作 (原始操作)
android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库的API, 使用该类可以完成对数据进行添加(Create).查询(Retrieve).更新(Update)和删除( ...
- Arduino VS. Raspberry Pi VS. Beaglebone Black
The Arduino is a small Atmel-based microcontroller development board easily integrated into many dif ...
- 【javascript】判断浏览设备是手机还是电脑
判断页面浏览设备是手机还是电脑,代码如下: function browserRedirect() { var sUserAgent = navigator.userAgent.toLowerCase( ...
- IOS7学习之路二(处理ios6到ios7后UITableView的两个显示问题)
1.在ios6开发的项目,当用ios7的虚拟机显示的时候会出现UINavigationItem遮挡TableView的问题: 下面是对比显示效果: 我的处理方法是: 在UITableViewContr ...
- 支持异步同步的分布式CommandBus MSMQ实现
支持异步同步的分布式CommandBus MSMQ实现 先上一张本文所描述的适用场景图 分布式场景,共3台server: 前端Server Order App Server Warehouse App ...
- EasyUI项目驱动学习
下面以一个项目简单介绍easyui的使用,主要包括以下组件 布局面板 - layout 可伸缩面板 - accordion 选项卡 - tabs 控制面板 - panel 窗口 - window 对话 ...