最近看了李建宗老师的面向对象的设计模式的课程。我把里面的代码记录了下来以供大家参考。其中有的地方我整理了一下,可能有的地方和课程里的不一样。
动机:
在软件系统中,经常面临着“某个对象”的创建工作;由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口。
如何应对这种变化?如何提供一种“封闭机制”来隔离出“这个易变对象”的变化,从而保持系统中“其他依赖该对象”不随着需求改变而改变?
意图:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。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 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();
}
}
{
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();
}
public static void Main()
{
//变化点
CarTestFramework carTestFramework = new CarTestFramework(new CarFactoryA());
//CarTestFramework carTestFramework = new CarTestFramework(new CarFactoryB());
carTestFramework.BuildTestContext();
}