原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part3-factory/

Design Patterns Simplified - Part 3 (Simple Factory)【设计模式简述--第三部分(简单工厂)】

This article explains why and how to use the Simple Factory Design Pattern in software development.
这篇文章解释了在软件开发中为什么使用,以及怎么使用简单工厂模式。

I am here to continue the discussion of Design Patterns. Today we will explain another creational design pattern called Simple Factory.

我在这继续来讨论设计模式。今天我将会解释另一个创造性的设计模式,也就是简单工厂模式。

In case you have not had a look at our previous articles, go through the following link:

假设你没有看我之前的文章,请先回去看,下面是链接:

Before talking about its implementation let's begin with some fundamental questions as in the following.

在讨论如何实现简单工厂模式之前,先看下下面一些基本的问题:

Purpose of the Factory pattern【工厂模式的目的】

I can think of two main objectives of using the Factory pattern. One is to achieve loose coupling between the client and business layer, another is to keep all the code for all the object instantiation logic in one place.

我能想到使用工厂模式的两个主要的目的。一个是在客户端和业务层之间达到松耦合,另外一个是确保所有对象的实例化的逻辑代码都在一个位置。

Purpose of loose coupling【松耦合的目的】

In modern software development where changes in existing systems are frequent and software design is expected to be scalable, not having a loosely-coupled design can create many problems.

在现代软件开发的过程中,需求的变更是很频繁的,所以软件的设计应该是要可扩展性好的,没有一个松耦合的设计,可能会有很多问题。

For example, in an application with a 3-layer architecture, if object creation logic is at the client side, for any new addition of concrete classes, the developer needs to modify not just the business but the client layer as well. Think about the maintainability and added testing effort.

例如,在一个简单三层框架的项目中,如果对象的创建是在客户端,那么任何新添加的具体的实体类,开发者,不仅需要去修改业务层还有客户端层。为了考虑可维护性,还需要添加测试的工作。

How about if the client is only aware of the high-level contracts and not about its concreate implementation?

如果客户端只需要关心和高一层次的关系,而不用关心具体的实现呢?

Yes, you got it right! The client just must pass the type of the object it needs and it will get it using the Factory Pattern.

Enough theory. Now let's talk about implementation.

是的,你是对的!客户端仅仅只需要传递对象需要的类型,剩下的就交给工厂模式去做。理论已经足够了,现在我们来讨论一下,如何实现简单工厂模式吧。

How to use the Simple Factory Pattern【怎么样来使用简单工厂模式】

Let's try to understand using a simple example.

Assume the client wants to know the on-road price of various brands of cars and have an interface as in the following.

我们使用一个简单的例子,来理解简单工厂模式吧。假设客户想要知道路上各种品牌汽车的价格,提供了下面一个这样的接口。

我们创建一个控制台程序,来学习简单工厂模式:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
public interface ICar
{
/// <summary>
/// 获取汽车价格
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
string GetOnRoadPrice(string model);
}
}

We need to create a Factory class now that will sit between the client and business layers and it will provide the required object to the client based on the car brand passed.

我们现在需要去创建一个工厂类,这个工厂类位于客户端和业务层之间,并基于传递的汽车品牌,提供客户端需要的对象。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
public class CarFactory
{
/// <summary>
/// 获取汽车对象
/// </summary>
/// <param name="carBrand">汽车品牌</param>
/// <returns></returns>
public static ICar GetCar(string carBrand)
{
if (carBrand.ToLowerInvariant() == "baoma")
{
return new BaoMa();
}
else if (carBrand.ToLowerInvariant() == "benchi")
{
return new BenChi();
}
else if (carBrand.ToLowerInvariant() == "aodi")
{
return new AoDi();
}
else
{
return null;
}
}
}
}

And here goes the concreate business classes.

这里接着创建具体的实体类。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ConsoleApplication1
{
class AoDi:ICar
{ public string GetOnRoadPrice(string model)
{
if (model.ToLowerInvariant() == "aodi")
{
return "300w 人民币";
}
else
{
return "你输入的汽车品牌找不到,请重新输入!!!";
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ConsoleApplication1
{
class BaoMa:ICar
{
public string GetOnRoadPrice(string model)
{
if (model.ToLowerInvariant() == "baoma")
{
return "200w 人民币";
}
else
{
return "你输入的汽车品牌找不到,请重新输入!!!";
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ConsoleApplication1
{
class BenChi:ICar
{
public string GetOnRoadPrice(string model)
{
if (model.ToLowerInvariant() == "glc")
{
return "550w 人民币";
}
else
{
return "你输入的汽车品牌找不到,请重新输入!!!";
}
}
}
}

Now let's see how the client can use the setup we have created so far.

现在,我们看看客户端怎么使用我们目前为止创建的对象。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//设置控制台标题栏中显示的标题
Console.Title = "简单工厂模式Demo学习";
ICar car = null;
string model = null; //奔驰车测试
car= CarFactory.GetCar("BenChi");
model = "glc";
Console.WriteLine("奔驰系列{0}的汽车,售价为{1}",model,car.GetOnRoadPrice(model));
Console.ReadKey();
}
}
}

And here goes the class diagram.
这是类图:

As you can see in the preceding code, the client is getting the required object by just passing the car brand. And then it calls the GetOnRoadPrice method to get the On-road price by passing model name. So just to summarize, using simple factory, we achieved the following.
上面的代码中你可以看到,客户端获取需要的对象,仅仅通过传递汽车的品牌就可以了。然后传递model name调用GetOnRoadPrice 方法来获取价格。所以总结一下,使用简单工厂模式,我们达到了下面的目的。
  • Loose coupling between client and business layers.【客户端和业务层之间的松耦合。】
  • Placed object creation logic at common place.【把对象的创建逻辑,放在了一个公共的地方。】
  • Abstracted concreate classes (Maruti, Hyundai) from client.【客户端的类抽象化】

I hope you have liked this article. I look forward to your comments/suggestions.

我希望你喜欢这篇文章,期待你的评论和建议。

 

Design Patterns Simplified - Part 3 (Simple Factory)【设计模式简述--第三部分(简单工厂)】的更多相关文章

  1. Design Patterns Simplified - Part 2 (Singleton)【设计模式简述--第二部分(单例模式)】

    原文链接: http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part-2-singleton/ De ...

  2. Design Patterns | 01 为什么要尽早掌握设计模式

    标题:Design Patterns | 01 为什么要尽早掌握设计模式 链接: 标签:设计模式 摘要:设计模式是前人经验的总结,教大家如何写出可扩展.可读.可维护的高质量代码.设计模式与日常工作中的 ...

  3. Java 设计模式系列(三)抽象工厂

    Java 设计模式系列(三)抽象工厂 每天用心记录一点点.内容也许不重要,但习惯很重要!

  4. Java 设计模式系列(二)简单工厂模式和工厂方法模式

    Java 设计模式系列(二)简单工厂模式和工厂方法模式 实现了创建者和调用者的分离.分为:简单工厂模式.工厂方法模式.抽象工厂模式 简单工厂模式.工厂方法模式都很简单,就不详细介绍了. 一.简单工厂 ...

  5. 设计模式(C#)——02简单工厂模式

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321       工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来.通俗来说,你只关心怎么用,不用关心怎么做 ...

  6. 学习设计模式第二十七 - GoF之外简单工厂模式

    示例代码来自<深入浅出设计模式>和<大话设计模式> 概述 简单工厂模式又被称为静态工厂模式,属于类的创建型模式.其实质是由一个工厂类根据传入的参量,动态决定应该创建出哪一个产品 ...

  7. Javascript设计模式理论与实战:简单工厂模式

    通常我们创建对象最常规的方法就是使用new关键字调用构造函数,这会导致对象之间的依赖性.工厂模式是一种有助于消除类之间依赖性的设计模式,它使用一个方法来决定要实例化哪一个类.本文详细介绍了简单工厂模式 ...

  8. 设计模式(二)——Java简单工厂模式

    简单工厂模式 案例: 披萨的项目(要便于披萨种类的扩展,要便于维护) 1)披萨的种类很多(比如 GreekPizz.CheesePizz 等) 2)披萨的制作有 prepare,bake, cut, ...

  9. [Python设计模式] 第1章 计算器——简单工厂模式

    github地址:https://github.com/cheesezh/python_design_patterns 写在前面的话 """ 读书的时候上过<设计模 ...

随机推荐

  1. 多个Img标签之间的间隙处理方法

    1.多个标签写在一行 <img src="/i/eg_tulip.jpg" alt="郁金香" height="100px"/> ...

  2. 深入Java虚拟机--判断对象存活状态

    程序计数器,虚拟机栈和本地方法栈 首先我们先来看下垃圾回收中不会管理到的内存区域,在Java虚拟机的运行时数据区我们可以看到,程序计数器,虚拟机栈,本地方法栈这三个地方是比较特别的.这个三个部分的特点 ...

  3. C# BackgroundWorker 详解

    在C#程序中,经常会有一些耗时较长的CPU密集型运算,如果直接在 UI 线程执行这样的运算就会出现UI不响应的问题.解决这类问题的主要途径是使用多线程,启动一个后台线程,把运算操作放在这个后台线程中完 ...

  4. iosselect:一个js picker项目,在H5中实现IOS的select下拉框效果

    具体文档和demo可以访问github:https://github.com/zhoushengmufc/iosselect 移动端浏览器对于select的展示样式是不一致的,ios下是类似原生的pi ...

  5. BPM配置故事之案例12-触发另外流程

    还记得阿海么,对就是之前的那个采购员,他又有了些意见. 阿海:小明,你看现在的流程让大家都这么方便,能不能帮个忙让我也轻松点啊-- 小明:--你有什么麻烦,现在不是已经各个部门自己提交申请了嘛? 阿海 ...

  6. Atitit 管理原理与实践attilax总结

    Atitit 管理原理与实践attilax总结 1. 管理学分类1 2. 我要学的管理学科2 3. 管理学原理2 4. 管理心理学2 5. 现代管理理论与方法2 6. <领导科学与艺术4 7. ...

  7. Android Bitmap 和 ByteArray的互相转换

    Android Bitmap 和 ByteArray的互相转换 移动平台图像处理,需要将图像传给native处理,如何传递?将bitmap转换成一个 byte[] 方便传递也方便cpp代码直接处理图像 ...

  8. kafka

    2016-11-13  20:48:43 简单说明什么是kafka? Apache kafka是消息中间件的一种,我发现很多人不知道消息中间件是什么,在开始学习之前,我这边就先简单的解释一下什么是消息 ...

  9. nuget常用命令

    nuget命令的用法: 一.安装 1.安装指定版本类库install-package <程序包名> -version <版本号> 2.安装到指定的项目install-packa ...

  10. CentOs7 +Jexus 5.8.2部署Asp.Net Core WebApi 1.0生产环境

    Jexus 是一款运行于 Linux 平台,以支持  ASP.NET.PHP 为特色的集高安全性和高性能为一体的 WEB 服务器和反向代理服务器.最新版 5.8.2 已经发布,有如下更新: 1,现在大 ...