从设计模式的类型来说,简单工厂模式是属于创建性模式,又叫做静态工厂方法模式,但不属于23中[GOF](http://baike.baidu.com/link?url=uPsikCi-gAyc4SH5sLMa-a5VUL_tN9V9hzP5xGTvX7qhe4U7RybvWR56lvOVHC8H_uC3AbgubDoc6joxNMPTaq)设计模式之一,简单的工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
那么到底什么是简单工厂模式?我们中午在中快食堂吃饭,中快食堂满足了我们的需求,这里的中快食堂就是一个简单的工厂,在现实生活中工厂是负责生产产品的,,同样在设计模式中,简单工厂模式我们也可以理解为负责生产对象的一个类,我们平常编程中,当使用new关键字创建一个对象时,此时该类就依赖与这个对象,也就是她们之间的耦合度高,当需求变化时,我们就不得不去修改此类的源码,此时我们可以运用oo很重要的原则去解决这一问题,该原则就是封装改变,自然也就要找到改变的代码,然后把改变的代码用类来封装,这样的一种思路也就是我们简单工厂模式的实现方式了,举个生活中的例子。
寒暑假食堂没有开门,提高班的孩子,有的在外面吃饭,当然手巧的孩子也可以自己在家做饭吃,但是自己要做饭比较麻烦哈,因为要去元辰超市买菜,油盐酱醋肯定少不了,然而,也可以选择去九之巢,烧饼,灌饼,煎饼随你挑,这里,每个小摊位就充当简单工厂的角色,那么这些生活中我们每天都在经历的事情,在我们的编程世界中又是如何实现的呢。
自己做饭的情况:
~~~
///
/// 自己做饭的情况
/// 没有简单工厂之前,客户想吃什么菜只能自己炒的
///
public class Customer
{
///
/// 烧菜方法
///
///
///
public static Food Cook(string type)
{
Food food = null;
// 珊珊说:我想吃酸辣土豆丝怎么办?
// 澜澜说:那你就自己烧啊!
// 珊珊说: 好吧,那就自己做吧!
if (type.Equals("酸辣土豆丝"))
{
food = new ChiliSourPotato();
}
// 我还想吃土姜汁皮蛋, 这个还是得自己做
// 我觉得自己做好麻烦,如果能有人帮我做就好了?
else if (type.Equals("姜汁皮蛋"))
{
food = new PreservedEggSinGingerSauce();
}
return food;
}
static void Main(string[] args)
{
Food food1 = Cook("酸辣土豆丝");
food1.Print();
Food food2 = Cook("姜汁皮蛋");
food1.Print();
Console.Read();
}
}
///
/// 菜抽象类
///
public abstract class Food
{
// 输出点了什么菜
public abstract void Print();
}
///
/// 酸辣土豆丝这道菜
///
public class ChiliSourPotato : Food
{
public override void Print()
{
Console.WriteLine("一份酸辣土豆丝!");
}
}
///
/// 姜汁皮蛋这道菜
///
public class PreservedEggSinGingerSauce : Food
{
public override void Print()
{
Console.WriteLine("一份姜汁皮蛋");
}
}
~~~
毛爷爷打江山的时候说,自己动手风衣足食,紧张的学习之后,自己动手做事,也不失为美事一件,但是有时候重复做一件事儿,总想着要买什么菜啊,中午做什么啊,就会感到厌烦,保不准做饭的时候就会把盐当成白糖,那午饭就......,所以,偶尔我们可以去小餐馆,呼呼,这里的餐馆就相当于简单工厂,我们可以把这些操作交给餐馆去做,此时消费者对菜的依赖关系从直接变成间接,这样就实现了面向对象的另一个原则,降低对象之间的耦合度。每次去餐馆吃饭,你想到了么?这个也可以在我们的编程世界中实现,代码如下:
~~~
///
/// 顾客充当客户端,负责调用简单工厂来生产对象
/// 即客户点菜,厨师(相当于简单工厂)负责烧菜(生产的对象)
///
class Customer
{
static void Main(string[] args)
{
// 客户想点酸辣土豆丝
Food food1 = FoodSimpleFactory.ChiliSourPotatod("酸辣土豆丝");
food1.Print();
// 客户想点一个姜汁皮蛋
Food food2 = FoodSimpleFactory. PreservedEggSinGingerSauce("姜汁皮蛋");
food2.Print();
Console.Read();
}
}
///
/// 菜抽象类
///
public abstract class Food
{
// 输出点了什么菜
public abstract void Print();
}
///
/// 酸辣土豆丝这道菜
///
public class ChiliSourPotatod : Food
{
public override void Print()
{
Console.WriteLine("一份酸辣土豆丝!");
}
}
///
/// 姜汁皮蛋这道菜
///
public class PreservedEggSinGingerSauce : Food
{
public override void Print()
{
Console.WriteLine("一份姜汁皮蛋");
}
}
///
/// 简单工厂类, 负责 炒菜
///
public class FoodSimpleFactory
{
public static Food CreateFood(string type)
{
Food food = null;
if (type.Equals("酸辣土豆丝"))
{
food= new ChiliSourPotatod();
}
else if (type.Equals("姜汁皮蛋"))
{
food= new PreservedEggSinGingerSauce();
}
return food;
}
}
~~~
接着我们来介绍一下简单工厂模式中的UML图,通过前面我们知道,简单工厂模式又叫静态方法模式(因为工厂类都定义了一个静态方法),由一个工厂类根据传入的参数决定创建出哪一种产品类的实例(通俗点表达:通过客户下的订单来负责烧那种菜)。以上述去餐馆吃饭为例,简单工厂模式的UML图如下:
![](https://box.kancloud.cn/2015-12-30_5683743246ec9.jpg)
通过楚广明C#视频的学习,对c#有了一定的了解,带着这一点懵懵懂懂的了解,我走进了大鸟和小菜的世界,一个个短小精炼的小故事,一场场面向对象编程思维的舞蹈,成为了《大话设计模式》这本书最温馨美丽的部分,喜欢那个好学,天真,执着的小菜,崇拜那个善于启发,经验老到的大鸟,就这样,慢慢的靠近.........