【設計模式】工廠方法模式

定義


定義一個用於建立對象的接口,讓子類決定實例化哪個類。工廠方法使一個類的實例化延遲到其子類git

優缺點


  • 優勢

針對簡單工廠不容易擴展,工廠方法將實例化延遲到子類工廠,從而提供擴展github

  • 缺點

每次新增產品都須要添加工廠和具體產品類,增長系統複雜性框架

角色


  • 客戶端 --> 抽象工廠,具體工廠, 抽象產品
  • 抽象產品 --> 具體產品
  • 具體產品
  • 抽象工廠 --> 抽象產品
  • 具體工廠 --> 抽象產品,具體產品

代碼


  • 抽象產品
public abstract class Phone
{
    public abstract void Call();
}
  • 具體產品
public class IPhone : Phone
{
    public override void Call()
    {
        System.Console.WriteLine("Call by IPhone");
    }
}
public class AndroidPhone : Phone
{
    public override void Call()
    {
        System.Console.WriteLine("Call by Android");
    }
}
  • 抽象工廠
public abstract class PhoneFactory
{
    public abstract Phone Create();
}
  • 具體工廠
public class IPhoneFactory : PhoneFactory
{
    public override Phone Create()
    {
        return new IPhone();
    }
}
public class AndroidFactory : PhoneFactory
{
    public override Phone Create()
    {
        return new AndroidPhone();
    }
}
  • 客戶端
Phone phone = new IPhoneFactory().Create();
phone.Call();

phone = new AndroidFactory().Create();
phone.Call();

簡單工廠 VS 工廠方法

假設如今須要擴展手機產品,增長鴻蒙OS手機ide

  • 簡單工廠
  1. 增長具體手機類 HarmonyPhone
  2. 修改靜態工廠方法增長HarmonyPhone判斷(違反開閉原則)
  • 工廠方法
  1. 增長具體手機類 HarmonyPhone
  2. 增長具體工廠類 HarmonyFactory

總結

工廠方法模式是典型的解耦框架,經過增長抽象工廠,客戶端與具體產品解耦,抽象工廠與具體產品解構code

符合迪米特法則,不須要知道具體產品如何構造對象

符合依賴倒置原則,只依賴產品類的抽象繼承

符合里氏替換原則,父類出現的地方均可以用子類替換,由於沒有破壞繼承體系接口

固然最重要複合開閉原則,當須要擴展產品時,並不須要改動原來代碼,只需增長新的具體產品類,具體工廠類get


示例代碼 - Github產品

相關文章
相關標籤/搜索