c#学习无限

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

工厂方法设计模式

 定义
 UML图的
 参与者
 在C#中的示例代码

 

 

 

定义

Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses

定义了一个用于创建对象的接口,但是让子类去决定实例化哪一个类。工厂方法让一个类的实例化延迟到其子类。 

使用频率:  高 

 

UML类图

 

参与者

    参与这种模式的类和/或对象是:

  • Product  (Car)
    • 定义了一个接口,这个接口将用于工厂方法创建具体的对象。
  • ConcreteProduct   (BMWCar,BensCar)
    • 实现产品界面
  • Creator(CarFactory)
    • 声明工厂方法,该方法返回一个对象类型产品。造物主也可以定义返回一个默认ConcreteProduct对象的工厂方法的默认实现。
    • 可以调用工厂方法来创建一个Product对象。
  • ConcreteCreator   (BMWCarFactory)
    • 覆盖了工厂方法返回一个实例的ConcreteProduct。

在C#中的示例代码

这种结构的代码演示了工厂方法创建不同的对象提供了极大的灵活性。抽象类可以提供一个默认的对象,但每个子类可以实例化的对象的扩展版本。

View Code
// Factory Method pattern -- Structural example

using System;

namespace DoFactory.GangOfFour.Factory.Structural
{
    /// <summary>
    /// MainApp startup class for Structural
    /// Factory Method Design Pattern.
    /// </summary>
    class MainApp
    {
        /// <summary>
        /// Entry point into console application.
        /// </summary>
        static void Main()
        {
            // An array of creators
            Creator[] creators = new Creator[2];

            creators[0] = new ConcreteCreatorA();
            creators[1] = new ConcreteCreatorB();

            // Iterate over creators and create products
            foreach (Creator creator in creators)
            {
                Product product = creator.FactoryMethod();
                Console.WriteLine("Created {0}",
                  product.GetType().Name);
            }

            // Wait for user
            Console.ReadKey();
        }
    }

    /// <summary>
    /// The 'Product' abstract class
    /// </summary>
    abstract class Product
    {
    }

    /// <summary>
    /// A 'ConcreteProduct' class
    /// </summary>
    class ConcreteProductA : Product
    {
    }

    /// <summary>
    /// A 'ConcreteProduct' class
    /// </summary>
    class ConcreteProductB : Product
    {
    }

    /// <summary>
    /// The 'Creator' abstract class
    /// </summary>
    abstract class Creator
    {
        public abstract Product FactoryMethod();
    }

    /// <summary>
    /// A 'ConcreteCreator' class
    /// </summary>
    class ConcreteCreatorA : Creator
    {
        public override Product FactoryMethod()
        {
            return new ConcreteProductA();
        }
    }

    /// <summary>
    /// A 'ConcreteCreator' class
    /// </summary>
    class ConcreteCreatorB : Creator
    {
        public override Product FactoryMethod()
        {
            return new ConcreteProductB();
        }
    }
}

 

这个现实世界中的代码演示了工厂方法创建不同的文件提供灵活性。导出文件类报告和恢复文档类的实例化的扩展版本。在这里,被称为工厂方法的文档基类的构造函数中。

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Pattern.FactoryMetod
{
    #region Product

    public abstract class Car
    {
        public abstract void Run();
    }

    #endregion

    #region ConcreateProduct

    public class BMWCar:Car
    {
        public override void Run()
        {
            Console.Write("宝马车再跑");
        }
    }
    
    #endregion

    #region Creator

    public abstract class CarFactory
    {
        public abstract Car CreateCar();
    }

    #endregion

    #region ConcreateCreator

    public class BMWCarFactory : CarFactory
    {
        public override Car CreateCar()
        {
            return new BMWCar();
        }
    }

    #endregion
}

 客户端调用

View Code
using System;
using System.Collections.Generic;
using Pattern.FactoryMetod;

namespace Pattern
{
    class MainApp
    {
        static void Main()
        {
            Car car = new BMWCarFactory().CreateCar();
            car.Run();

            Console.ReadKey();
        }
    }
}

 

posted on 2013-05-08 17:28  网网由鱼  阅读(167)  评论(0)    收藏  举报