工厂方法模式其实和简单工厂模式极其的相似,关于这个,可以自行观看我的上一篇文章,进行比较: 简单工厂模式
接下来举个小商店的例子,使用工厂方法这个设计模式,完成商品的上架。
首先第一步,自然是先定义一个商品接口,面向接口进行设计
1 /// <summary> 2 /// 商品接口 3 /// </summary> 4 public interface IProduct 5 { 6 /// <summary> 7 /// 展示自己 8 /// </summary> 9 void Show(); 10 }
然后我们的商品去继承这个接口,实现 Show 方法
1 /// <summary> 2 /// 电脑 3 /// </summary> 4 public class Computer : IProduct 5 { 6 public void Show() 7 { 8 Console.WriteLine("我是性价比极高的电脑"); 9 } 10 }
我们的上层表现层,也就是控制台的main方法里,让商品上架
1 static void Main(string[] args) 2 { 3 Console.WriteLine("小店开张啦,买一送一!"); 4 5 IProduct computer = new Computer(); 6 7 Console.ReadKey(); 8 }
然后我们的例子就这样实现了。但是现在其实是没有用到工厂方法模式,接下来,就让我们用工厂方法模式的思维去改造他。
给 Computer 创建一个工厂类
1 public class ComputerFactory 2 { 3 public Computer GetInstance() 4 { 5 return new Computer(); 6 } 7 }
里面的内容很简单,就是一个GetInstance方法,然后方法具体的实现就是new一个computer对象而已。
修改上层的main方法
1 static void Main(string[] args) 2 { 3 Console.WriteLine("小店开张啦,买一送一!"); 4 5 //IProduct computer = new Computer(); 6 IProduct computer = new ComputerFactory().GetInstance(); 7 8 Console.ReadKey(); 9 }
这里面的区别在于,我们把原来的new操作,改由我们的工厂来实现。看到这里,你可能会觉得,直接new他不香吗?为什么还要这么劳师动众,特地新建一个class来实现一个简单的对象创建问题。
这里面其实最直观的好处有两个:第一,上层应用程序完全不用关心这个对象是怎么创建的,我只需要了解,这个工厂一定会给我一个怎么样的实例即可,这就使得,我们把焦点从上层挪移到了下层,使上层代码更加稳定。第二,因为对象的创建是在工厂里完成的,这就意味着,在对象创建之前或之后,我们都可以添加一切别的业务逻辑进去,不像之前一样,实例在创建的时候,因为代码是直接在上层写死的,导致无法扩展。
总结
工厂方法模式,是非常的吻合开闭原则的。他开放扩展,闭合修改,让上层代码更稳定,下层代码得以有更高的扩展性。