抽象工廠模式(Abstract Factory) 類圖 描述 抽象工廠: 多個抽象產品類,每個抽象產品類可以派生出多個具體產品類; 一個抽象工廠類,可以派生出多個具體工廠類; 每個具體工廠可以創建多個具體產品,即每個工廠可以生產一個產品集合。 應用場景 就拿生產轎車來說,轎車是由發動機、車輪、車體結 ...
抽象工廠模式(Abstract Factory)
類圖
描述
抽象工廠:
多個抽象產品類,每個抽象產品類可以派生出多個具體產品類;
一個抽象工廠類,可以派生出多個具體工廠類;
每個具體工廠可以創建多個具體產品,即每個工廠可以生產一個產品集合。
應用場景
就拿生產轎車來說,轎車是由發動機、車輪、車體結構、方向盤等部件組成的,現在要生產一輛轎車,於是可以把各部件抽象出來單獨封裝,再由汽車工廠來組裝轎車。
發動機介面
public interface IEngine { void Install(); }
發動機類
public class AudiEngine : IEngine { public void Install() { Console.WriteLine("安裝奧迪的發動機."); } } public class BenzEngine : IEngine { public void Install() { Console.WriteLine("安裝賓士的發動機."); } }
車體結構介面
public interface IBody { void Install(); }
車體結構類
public class AudiBody : IBody { public void Install() { Console.WriteLine("安裝奧迪的車身結構."); } } public class BenzBody : IBody { public void Install() { Console.WriteLine("安裝賓士的車身結構."); } }
車輪介面
public interface IWheel { void InstallLeftFrontWheel(); void InstallRightFrontWheel(); void InstallLeftBackWheel(); void InstallRightBackWheel(); }
車輪類
public class AudiWheel : IWheel { public void InstallLeftFrontWheel() { Console.WriteLine("安裝奧迪的左前車輪."); } public void InstallRightFrontWheel() { Console.WriteLine("安裝奧迪的右前車輪."); } public void InstallLeftBackWheel() { Console.WriteLine("安裝奧迪的左後車輪."); } public void InstallRightBackWheel() { Console.WriteLine("安裝奧迪的右後車輪."); } } public class BenzWheel : IWheel { public void InstallLeftFrontWheel() { Console.WriteLine("安裝賓士的左前車輪."); } public void InstallRightFrontWheel() { Console.WriteLine("安裝賓士的右前車輪."); } public void InstallLeftBackWheel() { Console.WriteLine("安裝賓士的左後車輪."); } public void InstallRightBackWheel() { Console.WriteLine("安裝賓士的右後車輪."); } }
汽車工廠介面
public interface ICarFactory { IBody CreateBody(); IEngine CreateEngine(); IWheel CreateWheel(); }
汽車工廠類
public class AudiFactory : ICarFactory { public IEngine CreateEngine() { return new AudiEngine(); } public IWheel CreateWheel() { return new AudiWheel(); } public IBody CreateBody() { return new AudiBody(); } } public class BenzFactory : ICarFactory { public IEngine CreateEngine() { return new BenzEngine(); } public IWheel CreateWheel() { return new BenzWheel(); } public IBody CreateBody() { return new BenzBody(); } }
調用
string value = ConfigurationManager.AppSettings["abstractFactoryPattern"]; ICarFactory factory = (ICarFactory)Assembly.Load(value.Substring(0, value.IndexOf('.'))).CreateInstance(value); IBody body = factory.CreateBody(); body.Install(); IEngine engine = factory.CreateEngine(); engine.Install(); IWheel wheel = factory.CreateWheel(); wheel.InstallLeftFrontWheel(); wheel.InstallRightFrontWheel(); wheel.InstallLeftBackWheel(); wheel.InstallRightBackWheel();