简单工厂模式

  简单工厂模式属于创建新模式,又称静态工厂方法。该模式可以简单的理解为客户通过传入工厂类不同的参数,工厂类返回给客户一个相应的实例化对象,

此过程中客户不需要关心实例化对象的具体类型与过程,只需要消费实例化后的对象。

  男生大多喜欢车,更希望拥有各种各样的车辆供自己使用,我们就用这个来举一个例子。车子太多了少不了车库,更需要有一个智能车库管家,根据我们

的出行目的自动的给我们匹配车辆,而我们只需要告诉管家我们的出行目的,管家自动给我们匹配车辆,省去了我们选择车辆的麻烦。

模式类图:

首先定义一个我们车的抽象类或者接口MyCar以及子类即我们各种车辆:

 1     /// <summary>
 2     /// 父类:也可使用接口代替
 3     /// </summary>
 4     public abstract class MyCar
 5     {
 6         public abstract void Driving();
 7     }
 8 
 9     /// <summary>
10     /// 商务车
11     /// </summary>
12     public class BusinessCar : MyCar
13     {
14         public override void Driving()
15         {
16             Console.WriteLine("驾驶商务车");
17         }
18 
19     }
20 
21     /// <summary>
22     /// 越野车
23     /// </summary>
24     public class OffroadCar : MyCar
25     {
26         public override void Driving()
27         {
28             Console.WriteLine("驾驶越野车");
29         }
30     }
31 
32     /// <summary>
33     /// 跑车
34     /// </summary>
35     public class SportCar : MyCar
36     {
37         public override void Driving()
38         {
39             Console.WriteLine("驾驶跑车");
40         }
41     }
View Code

然后根据我们的喜欢定义选择车辆的模式枚举,这里就简单定义三种出行模式,商务、兜风、旅行:

1     public enum Type
2     {
3         Business=1,
4         Offroad=2,
5         Sport=3
6     }
View Code

紧接着,我们就要设计我们的车库智能管家了:

 1     public class HousekeeperFactory
 2     {
 3         public MyCar SelectCar(Type type)
 4         {
 5             switch(type)
 6             {
 7                 case Type.Business:
 8                     return new BusinessCar();
 9                 case Type.Offroad:
10                     return new OffroadCar();
11                 case Type.Sport:
12                     return new SportCar();
13                 default:
14                     return new SportCar();
15             }
16         }
17     }
View Code

而我们在使用车辆的时候只需要选择出行模式即可:

        static void Main(string[] args)
        {
            try
            {
                MyCar myCar;
                HousekeeperFactory factory = new HousekeeperFactory();
                //我要去开会
                myCar= factory.SelectCar(Type.Business);
                myCar.Driving();
                //我要去旅游
                myCar = factory.SelectCar(Type.Offroad);
                myCar.Driving();
                //我要去兜风
                myCar = factory.SelectCar(Type.Sport);
                myCar.Driving();

                Console.ReadLine();

            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
View Code

运行输出:

 

采用简单工厂模式,主要实现责任的分割:工厂类负责创建对象,客户端只负责消费对象。避免了客户端直接实例化对象,降低了耦合度,同时提高了代码的复用性。

不过简单工厂模式主要适用于具体的实例化的对象类型少量且已经固定,如果增加新的对象类型就需要修改工厂类并重新编译整个工厂类,这样就违背开闭原则,也就

造成了简单工厂模式扩展性差的缺点,这个问题我们在下一篇介绍的工厂方法模式解决。

 

posted @ 2016-07-20 18:24  乐-张蒙  阅读(373)  评论(0编辑  收藏  举报