最近看了李建宗老师的面向对象的设计模式的课程。我把里面的代码记录了下来以供大家参考。其中有的地方我整理了一下,可能有的地方和课程里的不一样。

动机:
  在软件系统中,经常面临着“某个对象”的创建工作;由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口。
  如何应对这种变化?如何提供一种“封闭机制”来隔离出“这个易变对象”的变化,从而保持系统中“其他依赖该对象”不随着需求改变而改变?

意图:
  定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。
  出自:《设计模式》GoF

Factory Method模式的几个要点:
  1、Factory Method模式主要用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系会导致软件的脆弱。
  2、Factory Method模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从面实现一个种扩展(而非更改)的策略,较好地解决了这种对耦合关系。
  3、Factory Method模式解决“单个对象”的需求变化,Abstract Factory模式解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化。





稳定部分代码:

    public abstract class Car
    
{
        
public abstract void Startup();
        
public abstract void Run();
        
public abstract void Turn();
        
public abstract void Stop();
    }


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


    
public class CarTestFramework
    
{
        CarFactory carFactory;

        
public CarTestFramework(CarFactory carFactory)
        
{
            
this.carFactory = carFactory;
        }

        
public void BuildTestContext(CarFactory carFactory)
        
{
            Car c1 
= carFactory.CreateCar();
            Car c2 
= carFactory.CreateCar();
            Car c3 
= carFactory.CreateCar();
            Car c4 
= carFactory.CreateCar();
        }

    }


变化部分代码:

    public class CarA : Car
    
{
        Enginee enginee1;
        Enginee enginee2;
        Enginee enginee3;
        Enginee enginee4;

        
public override void Startup()
        
{
            
        }

        
public override void Run()
        
{
            
        }

        
public override void Turn()
        
{
            
        }

        
public override void Stop()
        
{
            
        }

    }

    
public class FactoryA : CarFactory
    
{
        
public Car CreateCar()
        
{
            
return new CarA();
        }

    }


主程序:

    //应用于单个对象的变化
        public static void Main()
        
{
            
//变化点
            CarTestFramework carTestFramework = new CarTestFramework(new CarFactoryA());
            
//CarTestFramework carTestFramework = new CarTestFramework(new CarFactoryB());
            carTestFramework.BuildTestContext();
        }