设计模式学习笔记(五)——FactoryMethod工厂模式

原创 2007年09月18日 13:09:00
设计模式学习笔记(五)——FactoryMethod工厂模式

       刚开始接触设计模式时就常常听到同事提起工厂模式,那时也看过一些人写的Blog,但是往往把注意力放在代码的编写上。在这段时间的学习中慢慢体会到设计模式是用来解决一类问题,而不是某些固定的代码片段。换句话说是解决问题的思想。设计模式可以解决模块的耦合关系,可以解决因需求变动带来的问题。程序在第一次编写时,各个模块之间可能是紧耦合,但是经过代码重构,可以将模块之间变为松耦合。当然,我觉得我们也可以在软件设计之初把变化考虑到其中,对于业务型软件设计,在了解需求后,可以尽可能将其分出主次关系。也就是主体与枝节的关系。如下图


      
对于工厂模式来说,要求高层模块变化相对较慢,底层模块变化相对较快。这样符合设计模式中的依赖倒置原则——高层模块不依赖于底层模块。换句话说,软件设计是要划分易变部分和稳定部分。这样在一些枝节问题发生变化时,主干不用变化。如果是紧耦合状态,有可能造成一个地方变化,连带着很多地方要发生变化。

       工厂模式要解决的是“某个对象”的创建工作,由于需求的变化,这个对象常常面临着剧烈的变化,但是这个对象拥有的接口相对稳定。也就是说:枝节常常发生变化,但是枝节与主干的接口相对稳定。

       《设计模式》中是这样说明:定义一个用于创建对象的接口,让子类决定实例化那个类。FactoryMethod使得一个类的实例化延迟到子类。

       现在看这句话可能有些不明白,我们一会再来分析一下。先来看看工厂模式的大体结构。如下图:


      
我们还是用实例化汽车的例子来解释。对于客户端程序(ClientApp)如果想要一个汽车的对象,需要调用生产这个汽车的Factory的对象。当然,这个类继承自一个AbstractFactory基类。而这个Factory类就是《设计模式》中提到的“子类”,它来决定实例化那个类。

       下面我们来具体实现一下代码,首先,我们需要两个基类,一个是Car的,一个是Factory的。Factory类型的作用是构建Car的对象。代码如下:

public abstract class AbstractCar

    {

        public abstract string Run();

        public abstract string Stop();

        public abstract string Accelerate();

        public abstract string Decelerate();

    }

 

    public abstract class AbstractFactory

    {

        public abstract AbstractCar CreateCar();

    }

    下面,我们来做一个BMW的实现代码:

public class BMWCar:AbstractCar

    {

        public override string Run()

        {

            return "BMW Run";

        }

 

        public override string Stop()

        {

            return "BMW Stop";

        }

 

        public override string Accelerate()

        {

            return "BMW Accelerate";

        }

 

        public override string Decelerate()

        {

            return "BMW Decalerate";

        }

    }

 

    public class BMWFactory:AbstractFactory

    {

        public override AbstractCar CreateCar()

        {

            return new BMWCar();

        }

    }

这样我们就可以在客户端程序得到一个BMW的实例,并使用它的方法:

class Class1

    {

        /// <summary>

        /// 应用程序的主入口点。

        /// </summary>

        [STAThread]

        static void Main(string[] args)

        {

            AbstractCar car = CreateCarFunc(new BMWFactory ());

            Console.Write(car.Run() + "/n");

            Console.Write(car.Stop() + "/n");

            Console.Write(car.Accelerate() + "/n");

            Console.Write(car.Decelerate() + "/n");

            Console.Read();

        }

 

        public static AbstractCar CreateCarFunc(AbstractFactory factory)

        {

            return factory.CreateCar();

        }

}

在客户端程序中,我们AbstractFactory的对象来得到Car的对象

结果如下:

BMW Run

BMW Stop

BMW Accelerate

BMW Decalerate

如果我们需求变了,现在要BORA的对象,那末,我们首先要对程序作一下扩展,先加入BOARCar类和Factory类,代码如下:

public class BORACar:AbstractCar

    {

        public override string Run()

        {

            return "BORA Run";

        }

 

        public override string Stop()

        {

            return "BORA Stop";

        }

 

        public override string Accelerate()

        {

            return "BORA Accelerate";

        }

 

        public override string Decelerate()

        {

            return "BORA Decelerate";

        }

    }

 

    public class BORAFactory:AbstractFactory

    {

        public override AbstractCar CreateCar()

        {

            return new BORACar();

        }

}

在客户端程序中,我们只要稍作修改,将BMWFactory的实例化变为BORAFactory的实例化就可以,代码如下:

class Class1

    {

        /// <summary>

        /// 应用程序的主入口点。

        /// </summary>

        [STAThread]

        static void Main(string[] args)

        {

            AbstractCar car = CreateCarFunc(new BORAFactory());

            Console.Write(car.Run() + "/n");

            Console.Write(car.Stop() + "/n");

            Console.Write(car.Accelerate() + "/n");

            Console.Write(car.Decelerate() + "/n");

            Console.Read();

        }

 

        public static AbstractCar CreateCarFunc(AbstractFactory factory)

        {

            return factory.CreateCar();

        }

}

得到的结果是:

BORA Run

BORA Stop

BORA Accelerate

BORA Decelerate

Factory Method的几个要点:

1Factory Method模式主要用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系会导致软件的脆弱。

2Factory Method模式通过面向对象的手法,将所要创建的对象工作延迟到子类,从而实现一种扩展的策略,较好的解决了这种紧耦合关系。

 

相关文章推荐

设计模式学习笔记(五)——FactoryMethod工厂模式

刚开始接触设计模式时就常常听到同事提起工厂模式,那时也看过一些人写的Blog,但是往往把注意力放在代码的编写上。在这段时间的学习中慢慢体会到设计模式是用来解决一类问题,而不是某些固定的代码片段。换句话...
  • strliu
  • strliu
  • 2012年06月19日 14:04
  • 549

学习笔记——JAVA设计模式<2>工厂模式

工厂模式 实现了创建者和调用者的分离 详细分类 简单工厂模式 工厂方法模式 抽象工厂模式 面向对象设计的基本原则 ...

Java设计模式之抽象工厂模式——学习笔记

Java设计模式之抽象工厂模式 一、定义 抽象工厂模式提供了一个接口,用于创建相关或相依赖对象的家族,而不需要指定具体实现类 抽象工厂模式允许客户使用抽象接口来创建一组相关的产品,客户类和工厂类分开...

设计模式学习笔记——抽象工厂模式

定义: 为创建一组相关或相互依赖的对象提供一组接口,而且无需指定它们的具体类。 抽象工厂模式是工厂模式的升级版本,因为它应对的是更加复杂的业务,即当有多个业务品种、业务分类时,通过抽象工厂模式产生...

一、简单工厂模式——设计模式学习笔记

简单工厂模式,属于创建型模式,又叫做静态工厂方法模式。但不属于23种GOF设计模式之一。简单共产模式是由一个工厂对象决定创建出哪一种产品类的实例。...

十一、抽象工厂模式——设计模式学习笔记

抽象工厂模式,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。...

设计模式学习笔记——简单工厂模式

简单工厂模式学习笔记

《大话设计模式》学习笔记——第1章——简单工厂模式

最近开始学习《大话设计模式》这本书,以每章一篇博客的形式把学习心得记录下来。代码部分使用的均为C#,开发工具是VS2013,我的代码可以在[我的GitHub](https://github.com/1...

【设计模式】——工厂方法FactoryMethod

模式意图        工厂方法在MVC中应用的很广泛。   工厂方法意在分离产品与创建的两个层次,使用户在一个工厂池中可以选择自己想要使用的产品,而忽略其创建过程。   简单来说,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式学习笔记(五)——FactoryMethod工厂模式
举报原因:
原因补充:

(最多只允许输入30个字)