一、什么是工廠模式
定義:定義一個創建對象的接口,讓其子類自己決定實例化哪一個工廠類。
二、怎么使用工廠模式
首先模擬一個場景:有一個汽車工廠, 可以日本車、美國車、中國車。。。
這個場景怎么用工廠模式表達出來呢?
要生產汽車所以首先要有個汽車類
//抽象一個汽車類 public abstract class CarBreed { public string Name {get;set;} } public class JapanCar : CarBreed { public JapanCar(){ Console.WriteLine("日本車"); } } public class ChineseCar : CarBreed { public ChineseCar(){ Console.WriteLine("中國車"); } } public class USACar : CarBreed { public USACar(){ Console.WriteLine("美國車"); } }
首先用簡單工廠模式:(缺點:工廠類集中了所有產品創建邏輯,不利於擴展)
//汽車工廠(簡單工廠) public class CarFactory { public static CarBreed getCarBreed(string car) { switch(car) { case "JapanCar":return new JapanCar(); case "ChineseCar":return new ChineseCar(); case "USACar":return new USACar(); } } }
//程序入口 public class Program { public static void Main(string[] args) { // 日本車 CarBreed mycar = CarFactory.getCarBreed("JapanCar"); //中國車 mycar = CarFactory.getCarBreed("ChineseCar"); //美國車 mycar = CarFactory.getCarBreed("USACar"); Console.ReadLine(); } }
然后用工廠模式:
//汽車工廠(工廠模式) public abstract class CarFactory { public abstract CarBreed getCarBreed(); } //日本車工廠 public class JapanCarFactory : CarFactory { public override CarBreed getCarBreed() { return new JapanCar(); } } //中國車工廠 public class ChineseCarFactory : CarFactory { public override CarBreed getCarBreed() { return new ChineseCar(); } } //美國車工廠 public class USACarFactory : CarFactory { public override CarBreed getCarBreed() { return new USACar(); } }
//程序入口 public class Program { public static void Main(string[] args) { // 初始化工廠 CarFactory Factory = new JapanCarFactory(); //日本車 CarBreed mycar = Factory.getCarBreed(); //中國車 Factory = new ChineseCarFactory(); mycar = Factory.getCarBreed(); //。。。。。。。 Console.ReadLine(); } }
還有一種抽象工廠模式,這個比較復雜暫時還沒研究透徹這里就不做闡述
三、為什么要用工廠模式
優勢1:一般在代碼中,實例化一個類A是直接new A(),假如類A是一個完全獨立的類,沒有相似類,則沒有必要使用工廠模式。但是如果類A本身有一個相似類B,而在實際使用類A或者類B的實例時,如果關心的是類A與類B的共同部分,則工廠模式就可以體現出它的優勢。
優勢2:初始化封裝。在需求一個類的實例時,假如需要一個相同屬性的實例,每次初始化的操作是一樣的,用工廠模式可以對初始化進行封裝,簡化操作。
四、工廠模式使用場景
(1)客戶端不需要知道它所創建的對象的類。例子中我們不知道每個圖片加載器具體叫什么名,只知道創建它的工廠名就完成了床架過程。
(2)客戶端可以通過子類來指定創建對應的對象。