什么是工廠模式?
? ? ? ? 工廠是一種創建型設計模式。通俗來講就是提供一種封裝對象創建的方式,將對象的創建和使用區分開。就是Unity里面通常用到的創建和管理對象。
工廠模式有什么優點?
? ? ? ? 1、封裝對象的創建方式,使其更加靈活、易于管理、可擴展、可維護,降低代碼的耦合性。
? ? ? ? 2、提供一種統一的對象創建方式,代碼解讀更加容易懂、邏輯更加清晰。
? ? ? ? 3、可以根據不同的需求創建不同的對象。
工廠模式有什么缺點?
? ? ? ? 1、違反了單一職責原則;添加新類型時需要修改工廠類。(不包含抽象工廠模式)
? ? ? ? 2、增加了前期代碼的復雜度,需要創建更多的類(基類、管理類、派生類等)
? ? ? ? 感覺這也不算缺點吧。。。
工廠模式中的分類:
????????普通工廠模式、工廠方法模式、抽象工廠模式。
普通工廠模式
1、創建一個類作為其他派生類的基類
public class FactoryBase : MonoBehaviour
{protected string name;public virtual void OnUse(){Debug.LogError(name);}
}
2、再創建兩個派生類 Derive1、Derive2
public class Derive1 : FactoryBase
{public Derive1(){name = "Derive1";}public override void OnUse(){base.OnUse();GameObject o = new GameObject(name);o.AddComponent<Derive1>();}
}public class Derive2 : FactoryBase
{public Derive2(){name = "Derive2";}public override void OnUse(){base.OnUse();GameObject o = new GameObject(name);o.AddComponent<Derive1>();}
}
3、最后創建一個對象管理類
public class FactoryMgr : MonoBehaviour
{public static FactoryBase CreateItem(string deriveName){FactoryBase item = null;if (deriveName == "1"){item = new Derive1();}if (deriveName == "2"){item = new Derive2();}return item;}
}
應用普通工廠模式
這就是普通的工廠模式的應用
public class FactoryApply : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){FactoryMgr.CreateItem("1").OnUse();FactoryMgr.CreateItem("2").OnUse();}
}
工廠方法模式
1、定義派生類接口和派生類
public interface IDevive
{void Use();
}public class Devive1 : IDevive
{public void Use(){Debug.LogError("Devive1");}
}public class Devive2 : IDevive
{public void Use(){Debug.LogError("Devive2");}
}
2、再定義派生工廠接口和派生工廠類
public interface IFactory
{IDevive CreateDevive();
}public class Devive1Item : IFactory
{public IDevive CreateDevive(){return new Devive1();}
}public class Devive2Item : IFactory
{public IDevive CreateDevive(){return new Devive2();}
}
應用工廠方法模式
public class FactoryApply : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){var i1 = new Devive1Item().CreateDevive();i1.Use();var i2 = new Devive2Item().CreateDevive();i2.Use();}
}
抽象工廠模式
1、定義派生類接口和派生類
public interface IDevive
{void Use();
}public class Devive1 : IDevive
{public void Use(){Debug.LogError("Devive1");}
}public class Devive2 : IDevive
{public void Use(){Debug.LogError("Devive2");}
}
2、再定義派生工廠接口和派生工廠類
public interface IFactory
{IDevive CreateDevive();
}public class Devive1Item : IFactory
{public IDevive CreateDevive(){return new Devive1();}
}public class Devive2Item : IFactory
{public IDevive CreateDevive(){return new Devive2();}
}
3、抽象派生類管理器接口和派生類管理器
public interface IDeviveManager
{IFactory CreateDevive1Item();IFactory CreateDevive2Item();
}public class DeviveManager : IDeviveManager
{public IFactory CreateDevive1Item(){return new Devive1Item();}public IFactory CreateDevive2Item(){return new Devive2Item();}
}
應用抽象工廠模式
public class FactoryApply : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){IDeviveManager deviveManager = new DeviveManager();IFactory item1 = deviveManager.CreateDevive1Item();IDevive devive1 = item1.CreateDevive();devive1.Use();IFactory item2 = deviveManager.CreateDevive2Item();IDevive devive2 = item2.CreateDevive();devive2.Use();}
}
總結:
????????工廠模式定義了一個創建對象的接口,但由子類決定實例化哪個類。它使一個類的實例化延遲到其子類。
????????工廠模式通過將客戶端代碼與具體類的實例化過程解耦,使得系統更靈活。
? ? ? ? 但是,每增加一個子模塊就需要增加一個子類和工廠類,導致類的數量增加。