工厂方法设计模式
|  定义  UML图的  参与者 |  在C#中的示例代码 | 
UML类图


参与者
参与这种模式的类和/或对象是:
- Product  (Car)
- 定义了一个接口,这个接口将用于工厂方法创建具体的对象。
 
- ConcreteProduct   (BMWCar,BensCar)
- 实现产品界面
 
- Creator(CarFactory)
- 声明工厂方法,该方法返回一个对象类型产品。造物主也可以定义返回一个默认ConcreteProduct对象的工厂方法的默认实现。
- 可以调用工厂方法来创建一个Product对象。
- ConcreteCreator   (BMWCarFactory)
- 覆盖了工厂方法返回一个实例的ConcreteProduct。
 
在C#中的示例代码
这种结构的代码演示了工厂方法创建不同的对象提供了极大的灵活性。抽象类可以提供一个默认的对象,但每个子类可以实例化的对象的扩展版本。
 View Code
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
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
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(); } } }
 
                    
                 

 高
 高


 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号