Factory Method模式解決“單個對象”的需求變化;
Abstract Factory模式解決“系列對象”的需求變化;
Builder模式解決“對象部分”的需求變化。
耦合關係直接決定著軟體面對變化時的行為:
1、模組與模組之間的緊耦合使得軟體面對變化時,相關的模組都要隨之更改
2、模組與模組之間的松耦合使得軟體面對變化時,一些模組更容易被轉換或者,但其他模組保持不變
在軟體系統中,經常面臨著“某個對象”的建立工作;由於需求的變化,這個對象的具體實現經常面臨著劇烈的變化,但是它卻擁有比較穩定的介面。
如何應對這種變化?如何提供一種“封裝機制”秋隔離出“這個易變對象”的變化,從而保持系統中“其他依賴該對象的對象”不隨著需求改變而改變?
定義一個用於建立對象的介面,讓子類決定執行個體化哪一個類。Factory Method使得一個類的執行個體化延遲到子類。
1、一般做法:
class Car
{
public void Startup() { }
public void Run() { }
public void Turn(Direction direction) { }
public void Stop() { }
}
class CarTestFramework
{
public void BuildTestContext()
{
Car car = new Car();
}
public void DoTest()
{
Car car = new Car();
}
public TestData GetTestData()
{
Car car = new Car();
}
}
2、Factory 方法模式:
public abstract class AbstractCar
{
public abstract void Startup() { }
public abstract void Run() { }
public abstract void Turn(Direction direction) { }
public abstract void Stop() { }
}
public abstract class CarFactory
{
public abstract AbstractCar CreateCar();
}
public class HongqiCar : AbstractCar
{
Enginee enginee1;
Enginee enginee2;
public override void Startup() { }
public override void Run() { }
public override void Turn(Direction direction) { }
public override void Stop() { }
}
public class HongqiCarFactory : CarFactory
{
public override AbstractCar CreateCar()
{
return new HongqiCar();
}
}
public class DongfengCar : AbstractCar
{
Enginee enginee1;
Enginee enginee2;
public override void Startup() { }
public override void Run() { }
public override void Turn(Direction direction) { }
public override void Stop() { }
}
public class DongfengCarFactory : CarFactory
{
public override AbstractCar CreateCar()
{
return new DongfengCar();
}
}
class CarTestFramework
{
public void BuildTestContext(CarFactory carFactory)
{
AbstractCar car1 = carFactory.CreateCar();
AbstractCar car2 = carFactory.CreateCar();
}
public void DoTest(AbstractCar car)
{
car.Startup();
}
public TestData GetTestData(AbstractCar car)//獲得測試資料
{
car.Startup();
}
}
class App
{
public static void Main()
{
CarTestFramework carTestFramework = new CarTestFramework();
carTestFramework.BuildTestContext(new HongqiCarFactory());
carTestFramework.BuildTestContext(new DongfengCarFactory());
//CarTestFramework carTestFramework = new CarTestFramework();
//Type t = assembly.GetType("builderName");
//CarFactory carFactory = Activator.CreateInstance(t);
//carTestFramework.BuildTestContext(carFactory);
}
}
要點:
1、Factory Method模式主要用於隔離類對象的使用者和具體類型之間的耦合關係。面對一個經常變化的具體類型,緊耦合關係會導致軟體的脆弱。
2、Factory Method模式通過物件導向的手法,將所要建立的具體對象工作延遲到子類,從而實現一種擴充(而非更改)的策略,較好地解決了這種緊耦合關係。