一、引言
最近在看设计模式,同时在学习过程中也查看了大量的博客,也查阅了很多关于设计模式的一些文章的,在此,特别记录下我的学习笔记,加深自己对设计模式理解,同时可以给一些初学设计模式的朋友提供查阅的路径。
二、简单工厂模式介绍
什么是简单工厂模式?其实,我们也可以理解简单工厂模式为负责生产对象的一个类, 在平时的编程中,我们大多数都会使用"new"关键字创建一个对象,此时该类就依赖与这个对象,称为耦合度,当然这种情况下的耦合度时十分高的,当需求变化时,我们就不得不去修改此类的源码,为了解决这种维护起来复杂的情况,我们运用面向对象的原则去解决它,就是封装改变,既然要封装改变,自然也就要找到改变的代码,然后把改变的代码用类来封装,这样的一种思路也就是我们简单工厂模式的实现方式了。下面通过一个现实生活中的例子来引出简单工厂模式。举个例子:我们常在外吃饭,也可以自己在家做饭吃,但是自己做饭吃麻烦,因为又要自己买菜,然而,出去吃饭就完全没有这些麻烦的,我们只需要到餐馆点菜就可以了,买菜的事情就交给餐馆做就可以了,这里餐馆就充当简单工厂的角色,下面让我们看看现实生活中的例子用代码是怎样来表现的。该程序在WebForm中完成:
新建一个类:Customer.cs :
public class Customer
{
public static Food Cook(string type)
{
Food food = null;
// 想吃可乐鸡翅怎么办?自己做吧
if (type.Equals("可乐鸡翅"))
{
food = new Chicken();
}
// 又想吃红烧肉, 还是得自己做
else if (type.Equals("一份红烧肉"))
{
food = new Beef();
}
//就这样,想吃什么就自己做什么,很累的。
return food;
}
/// <summary>
/// 菜抽象类
/// </summary>
public abstract class Food
{
// 输出点了什么菜
public abstract string Print();
}
/// <summary>
/// 可乐鸡翅
/// </summary>
public class Chicken: Food
{
public override string Print()
{
return "一份可乐鸡翅!";
}
}
/// <summary>
/// 红烧肉
/// </summary>
public class Beef: Food
{
public override string Print()
{
return "一份红烧肉";
}
}
}
在aspx页面实例化:
protected void Page_Load(object sender, EventArgs e)
{
// 做可乐鸡翅
Food food1 = Cook("可乐鸡翅");
Response.Write(food1.Print());
Food food2 = Cook("红烧肉");
Response.Write(food2.Print());
}
效果:
我们可以发现,当我们想吃新的菜式时,就需要修改 Food Cook,然后在写一个新的方法输出点菜信息,这些操作十分繁琐,于是,为了解决这个问题,简单工厂就出现了,好比现在的餐馆,这样我们要吃什么直接说就行,其他不走交给了餐馆,降低了我们与才之间的依赖性。这样实现简单工厂如下:
修改 Customer.cs 如下:
public class Customer
{
/// <summary>
/// 菜抽象类
/// </summary>
public abstract class Food
{
// 输出点了什么菜
public abstract string Print();
}
/// <summary>
/// 可乐鸡翅
/// </summary>
public class Chicken: Food
{
public override string Print()
{
return "一份可乐鸡翅!";
}
}
/// <summary>
/// 红烧肉
/// </summary>
public class Beef: Food
{
public override string Print()
{
return "一份红烧肉";
}
}
/// <summary>
/// 简单工厂类, 负责 炒菜
/// </summary>
public class FoodSimpleFactory
{
public static Food CreateFood(string type)
{
Food food = null;
if (type.Equals("可乐鸡翅"))
{
food = new Chicken();
}
else if (type.Equals("红烧肉"))
{
food = new Beef();
}
return food;
}
}
}
我们发现这次的 customer.cs 类中,将烧菜方法封装成了一个单独的类,这时候,我们只用去修改这个工厂里的方法就可以了,而不用在之前的类中找方法去修改,这样有助于提高大型项目的维护效率。
在aspx页面实例化:
protected void Page_Load(object sender, EventArgs e)
{
// 客户想点一个可乐鸡翅
Food food1 = FoodSimpleFactory.CreateFood("可乐鸡翅");
Response.Write(food1.Print());
// 客户想点一个红烧肉
Food food2 = FoodSimpleFactory.CreateFood("红烧肉");
Response.Write(food2.Print());
}
细心的朋友会发现,在简单工厂模式下,我们只是把变化移到了工厂类中罢了,好像没有变化的问题,因为如果客户想吃其他菜时,此时我们还是需要修改工厂类中的方法,没错,这就是简单工厂的缺点。
三、总结
到这里,简单工厂模式的介绍都到这里了,后面将介绍工厂方法模式来解决简单工厂模式中存在的问题。