Design Patterns Simplified - Part 3 (Simple 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.

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

时间: 2024-10-11 17:17:49

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

深入理解设计模式(二):简单工厂模式

本文首先概述了简单工厂模式本质及结构,揭示了简单工厂模式的应用场景和优缺点,紧接着列举出了和工厂方法模式.策略模式的异同及应用场景,最后我们给出了简单工厂模式的实现方式及注意事项. 一.什么是简单工厂模式 简单工厂模式又称为静态工厂模式,实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例.简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例. 其实就是将一个具体类的实例化交给一个静态工厂方法来执行,它不属于GOF的23种设计

易学设计模式看书笔记(2) - 简单工厂模式

本文摘自易学设计模式一书 一.简单工厂模式 1.动物管理系统的例子 public interface Animal{ public void eat(); } public class Tiger implements Animal { public void eat(){ sysout.out.println("老虎会吃"); }; public void run(){ sysout.out.println("老虎会跑"); }; } public class D

设计模式(一): 简单工厂模式

一.模式定义 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式.在简单工厂模式中,可以根据参数的不同返回不同类的实例.简单来说,也就是由一个工厂类根据传入的参数决定创建出哪一种产品类的实例. 二.模式结构 (图片来自博客:https://blog.csdn.net/xingjiarong/article/details/49999121) 简单工厂模式主要有三个部分组成: 工厂类(Creator

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

通常我们创建对象最常规的方法就是使用new关键字调用构造函数,这会导致对象之间的依赖性.工厂模式是一种有助于消除类之间依赖性的设计模式,它使用一个方法来决定要实例化哪一个类.本文详细介绍了简单工厂模式的理论,并且举例说明了简单工厂模式的具体应用. 基本介绍 简单工厂模式是工厂模式中最基本的一种.通过定义一个工厂类,根据参数实例化具体的某个产品类. 举例说明 我们举个例子进行说明:假设我们开发一个旅游行业网站,网站上面销售机票,酒店等产品.一个用户准备购买一张机票.我们可以定义相关类如下: 1 v

设计模式笔记——策略模式VS简单工厂模式

策略模式VS简单工厂模式   策略模式(Strategy)它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. 1.组成 -抽象策略角色: 策略类,通常由一个接口或者抽象类实现. -具体策略角色:包装了相关的算法和行为. -环境角色:持有一个策略类的引用,最终给客户端调用. 2.应用场景 - 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为. -需要在不同情况下使用不同的策略(算法),或者策略还可能在未来

【设计模式学习笔记】 之 简单工厂模式

 简介:工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,拒绝客服端程序员通过new创建需要的实例,并且是通过使用一个共同的接口来指向新创建的对象,即接口引用指向实现类对象,是多态的灵活运用. 举例1[未使用工厂模式]: 一个家庭中有多辆汽车,这个家庭想去出游,需要先传一个Car到Family中持有,才能出游. 首先考虑多辆汽车,都有同样的ru

设计模式的C++实现 24.简单工厂模式

简单工厂模式,又称静态工厂模式,属于创造型模式,但又不是23中GOF设计模式之一.简单工厂是由一个工厂对象决定创造出哪种产品类的实例.简单工厂模式是工厂模式中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 简单工厂通过传入的参数判断创建哪一个产品的实例,封装了对象的创建,客服端看到的只是产品的抽象对象,不关心返回子类的类型. 简单来说,简单工厂就是调用是传入一个参数来告诉工厂类要创建一个什么样的对象,然后工厂类返回这个对象. 缺点是 没添加一个产品子类,都要在工厂类中添加一个判断分支

一起来学设计模式-----创建型模式之简单工厂

一直都特别想整体学习下设计模式,之前总觉得不是时候,觉得基础不够好怕吸收不了,或者体会不到设计模式带来的便利.就在上半年的KPI编写测试桩项目中,我就深刻的感受到设计模式带来的好处.一般测试人员写的代码不是很多,很多时候写代码也都是基于解决问题的逻辑来的,写的代码面向过程思路较多,因此代码的冗余度特别大.在编写一个大的测试工具时,就更应该考虑这方面的问题自己是否存在.刻不容缓的学习起了设计模式,整理就从创建型模式的工厂模式开始入手吧. 创建型模式,共三种:工厂方法模式.建造者模式.原型模式.其中

设计模式(一):简单工厂模式

最近在看设计模式方面的一些的内容,发现自己以前在面向对象编程方面的能力真的是太水了,实在是还有很多东西需要学习,从这篇文章开始会将所学到的设计模式写下来,也会附上自己的理解以及相关实验代码. 首先来讲讲简单工厂模式,试着想象我们平时生活中的工厂,一个工厂通常都是只有同一种类的产品,比如说鞋子,于是这个工厂里就会生产各种不同的鞋子,像皮鞋.帆布鞋.板鞋.跑步鞋等等.客户需要某种鞋子,当然不会自己生产,肯定是让工厂生产,然后客户去取货.那么客户就要告诉工厂需要哪种鞋子,工厂生产出来给客户就行了.这就