前言
工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择动态实例化相关类,对于客户端来说,去除了与具体产品的依赖。例如:计算器,只需要把“+”、“-”等给客户端,然后传入工厂,工厂就自动给出了相应的实例,但问题就这里,如果添加一个“*”的功能,我们一定要给工厂类的方法加‘case’判断的,修改原有的类?这就违背了开-闭原则。
1、公共类
1 /// <summary>
2 /// 这个人会挣钱,会开公司,男人,女人都要学习
3 /// </summary>
4 public class MaYun
5 {
6 public void Money()
7 {
8 Console.WriteLine("挣钱");
9 }
10 public void Company()
11 {
12 Console.WriteLine("开公司");
13
14 }
15 }
1 public class Man : MaYun
2 {
3
4 }
5 public class Woman : MaYun
6 {
7
8 }
二、简单工厂
工厂类:
1 public class SimpleFactory
2 {
3 public static MaYun CreateMaYun(string type)
4 {
5 MaYun m = null;
6 switch (type)
7 {
8 case "Man":
9 m = new Man();
10 break;
11 case "Woman":
12 m = new Woman();
13 break;
14 default:
15 break;
16
17 }
18 return m;
19 }
20 }
客户端:
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 #region 简单工厂
6 MaYun man1 = SimpleFactory.CreateMaYun("Man");
7 man1.Money();
8 man1.Company();
9 MaYun woman1 = SimpleFactory.CreateMaYun("Woman");
10 woman1.Money();
11 woman1.Company();
12 #endregion
13 }
14 }
三、工厂
定义工厂接口,并让男人的工厂和女人的工厂类继承该接口
1 public interface IFactory
2 {
3 MaYun CreateMaYun();
4 }
5 public class ManFactory : IFactory
6 {
7 public MaYun CreateMaYun()
8 {
9 return new Man();
10 }
11 }
12 public class WomanFactory : IFactory
13 {
14 public MaYun CreateMaYun()
15 {
16 return new Woman();
17 }
18 }
客户端:
1 class Program
2 {
3 static void Main(string[] args)
4 {
5
6 #region 工厂
7 //要修改为woman,只需修改 IFactory factory = new WoManFactory();
8 IFactory factory = new ManFactory();
9 MaYun mm = factory.CreateMaYun();
10 mm.Company();
11 mm.Money();
12 #endregion
13 }
14 }
总结:
1、尽管如果换成‘woman类’或者其他子类,还是要修改代码的,但只需要修改一处就可以了。
2、工厂模式克服了简单工厂违背开-闭原则的缺点,又保持了封装对象创建过程的优点。
参考书籍:大话设计模式