文章目錄
- 前言
- 簡單工廠模式
- 工廠方法模式
- 抽象工廠模式
- Unity實戰
前言
工廠模式是一種創建型設計模式,它提供了一種將對象的實例化過程封裝起來的方法,使得客戶端代碼不必直接依賴于具體類。這有助于降低代碼的耦合度,提高代碼的可維護性和可擴展性。在C#中,有三種常見的工廠模式:簡單工廠模式
、工廠方法模式
和抽象工廠模式
。下面詳細解釋這三種工廠模式。
簡單工廠模式
簡單工廠模式是最基本的工廠模式,它通過一個工廠類來創建對象。客戶端只需要知道要創建的產品的類型,而不需要知道具體的實現類。
- 首先定義一個抽象產品類。該類主要定義了產品的共有屬性和方法,用于子類繼承和實現。
public abstract class Car
{public abstract void GetName();public void Refuel(){Console.WriteLine("汽車加油");}
}
- 其次定義每個產品的具體實現子類。該類實現并繼承自抽象類,如需增加產品可直接創建新的子類并繼承自抽象類即可。
public class FordCar: Car
{public override void GetName(){Console.WriteLine("我是福特汽車");}
}public class HondaCar: Car
{public override void GetName(){Console.WriteLine("我是本田汽車");}
}
- 然后定義核心類,即工廠類。該類通過創建了一個枚舉類型參數來選擇需要創建的產品實例。
public class CarFactory
{public static Car CreateCar(CarType carType){switch (carType){case CarType.FordCar:return new FordCar();break;case CarType.HondaCar:return new HondaCar();break;default:break;}return null;}public enum CarType{FordCar,HondaCar}
}
- 最后客戶端調用。
class Program
{static void Main(string[] args){//通過CarFactory產品工廠創建了FordCar產品實例Car car = CarFactory.CreateCar(CarFactory.CarType.FordCar);car.GetName();//通過CarFactory產品工廠創建了HondaCar產品實例car = CarFactory.CreateCar(CarFactory.CarType.HondaCar);car.GetName();car.Refuel();}
}
對于客戶端來說,其去除了與具體產品之間的依賴。
簡單工廠模式的缺點主要就是違背了開閉原則
工廠方法模式
這是一種更高級的工廠模式,它通過抽象接口或基類中的工廠方法來創建對象。
具體實現由子類負責,因此更加靈活。這種設計方式有利于實現開閉原則,即對擴展開放,對修改封閉。
- 抽象產品類:
public abstract class Car
{public abstract void GetName();public void Refuel(){Console.WriteLine("汽車加油");}
}
- 具體產品類:
public class FordCar: Car
{public override void GetName(){Console.WriteLine("我是福特汽車");}
}public class HondaCar: Car
{public override void GetName(){Console.WriteLine("我是本田汽車");}
}
- 抽象工廠:
public abstract class CarFactory
{public abstract Car CreateCar();
}
- 具體產品工廠:
public class FordCarFactory: CarFactory
{public override Car CreateCar(){return new FordCar();}
}public class HondaCarFactory: CarFactory
{public override Car CreateCar(){return new HondaCar();}
}
- 客戶端調用:
class Program
{static void Main(string[] args){//創建一個汽車工廠,只負責生產福特汽車產品CarFactory carFactory = new FordCarFactory();//在福特汽車工廠中生產一個福特汽車產品Car car = carFactory.CreateCar();car.GetName();//創建一個汽車工廠,只負責生產本田汽車產品carFactory = new HondaCarFactory();//在本田汽車工廠中生產一個本田汽車產品car = carFactory.CreateCar();car.GetName();//汽車加油car.Refuel();}
}
抽象工廠模式
抽象工廠模式提供一個接口,用于創建相關或依賴對象的家族,而不需要指定具體類。它是工廠方法模式的推廣,不僅僅創建一個對象,而是創建一系列相關的對象。
- 抽象產品類,有多少個不同產品就創建多少個抽象產品類。實例中創建了兩種產品,即汽車和輪胎。
public abstract class Car
{public abstract void GetName();public void Refuel(){Console.WriteLine("汽車加油");}
}
public abstract class Tire
{public abstract void GetName();
}
- 具體產品類,不同產品繼承不同抽象類。實例中定義了兩種汽車和兩種輪胎,汽車為一個產品等級,輪胎是另外一個產品等級。
public class FordCar: Car
{public override void GetName(){Console.WriteLine("我是福特汽車");}
}public class HondaCar: Car
{public override void GetName(){Console.WriteLine("我是本田汽車");}
} public class FordTire: Tire
{public override void GetName(){Console.WriteLine("我是福特輪胎。");}
}public class HondaTire: Tire
{public override void GetName(){Console.WriteLine("我是本田輪胎。");}
}
- 抽象工廠類,有多少個系列就可以創建多少個抽象工廠類。
public abstract class CarFactory
{//生產汽車public abstract Car CreateCar();//生產輪胎public abstract Tire CreateTire();
}
- 具體工廠類,同一系列可以創建多個具體的工廠,負責同一系列下的不同產品出的創建。
public class FordCarFactory: CarFactory
{public override Car CreateCar(){return new FordCar();}public override Tire CreateTire(){return new FordTire();}
}public class HondaCarFactory: CarFactory
{public override Car CreateCar(){return new HondaCar();}public override Tire CreateTire(){return new HondaTire();}
}
- 客戶端調用:
class Program
{static void Main(string[] args){//首先創建一個汽車工廠CarFactory carFactory = new FordCarFactory();//然后對應工廠中生產出對應的不同產品。Car car = carFactory.CreateCar();car.GetName();Tire tire = carFactory.CreateTire();tire.GetName();carFactory = new HondaCarFactory();car = carFactory.CreateCar();car.GetName();tire = carFactory.CreateTire();tire.GetName();}
}
Unity實戰
https://dingxiaowei.cn/2017/05/14/