面向对象编程思想-工厂方法模式

一、引言

上篇博客中,我们有讲到简单工厂模式,它解决了客户端和对象之间直接依赖的问题,但只要新增加产品就需要修改工厂类,这样使得简单工厂类的逻辑会变得越来越复杂。那如何解决这个问题呢?下面来看看今天我们学习的工厂方法模式,是如何解决这个问题的。

二、工厂方法模式

定义:工厂方法模式将对象的创建放在具体的工厂中去做,不再将所有的逻辑集中在工厂里,而只是提供具体工厂必需实现的接口,这样新增加产品时就不需要修改工厂类,可以通过新增加具体工厂类的方式解决简单工厂的问题。下面通过一个例子,帮助我们理解工厂方法模式

下面是代码demo:

namespace DNA.Framework.FactoryMethod
{
  //车子抽象类
public abstract class BaseCar { public abstract void Run(); } }

 

namespace DNA.Framework.FactoryMethod
{
  //宝马类
class BMW : BaseCar { public override void Run() { Console.WriteLine("我今天开{0}去上班",this.GetType().Name); } } }

 

namespace DNA.Framework.FactoryMethod
{
    class MBZ : BaseCar
    {
    //奔驰类
public override void Run() { Console.WriteLine("我今天开{0}去上班", this.GetType().Name); } } }

 

namespace DNA.Framework.FactoryMethod
{
  //接口工厂类(这里其实用抽象类较好)
interface IBaseFactory { BaseCar GetCar(); } }

 

namespace DNA.Framework.FactoryMethod
{
  //宝马工厂类
class BMWFactory:IBaseFactory { public BaseCar GetCar() { return new BMW(); } } }

 

namespace DNA.Framework.FactoryMethod
{
  //奔驰工厂类
class MBZFactory : IBaseFactory { public BaseCar GetCar() { return new MBZ(); } } }

 

namespace DNA.Framework.FactoryMethod
{
  //客户端调用
class Program { static void Main(string[] args) {  
       //初始化工厂 IBaseFactory bmwFactory
= new BMWFactory();
       //通过工厂创建对象 BaseCar bmw
= bmwFactory.GetCar(); IBaseFactory mbzFactory = new MBZFactory(); BaseCar mbz = mbzFactory.GetCar(); // IBaseFactory ferrariFactory = new FERRARIFactory(); // BaseCar ferrari = ferrariFactory.GetCar(); bmw.Run(); mbz.Run(); // ferrari.Run(); Console.Read(); } } }

 

当我们需要新增一个产品的时候,比如我想开法拉利去上班,只需要新增具体的工厂类,产品类,不用去修改抽象工厂和具体工厂类中的代码,通过多态性完成了系统的扩展。比如某天我想开着法拉利去上班,只需要新增法拉利工厂和法拉利类就可以实现,代码如下:

namespace DNA.Framework.FactoryMethod
{
  //法拉利工厂类
class FERRARIFactory : IBaseFactory { public BaseCar GetCar() { return new FERRARI(); } } }

 

namespace DNA.Framework.FactoryMethod
{
  //法拉利类
class FERRARI:BaseCar { public override void Run() { Console.WriteLine("我今天开{0}去上班", this.GetType().Name); } } }

 

优点:比起简单工厂

工厂方法模式把对象创建延迟到具体的工厂类中,相对简单工厂的不足做了优化,对扩展开放,对修改封闭,很好的符合了开闭原则。

补充:并不是工厂方法模式比简单工厂模式好,要看具体应用什么到什么样的业务场景。

 

本文关于设计模式之工厂方法模式的学习就到这里了,希望能够帮到你,若有不足,欢迎斧正,感谢您的阅读。

参考:http://www.cnblogs.com/zhili/p/SimpleFactory.html

posted @ 2017-06-01 14:13  快跑啊兔兔  阅读(644)  评论(0)    收藏  举报