C#面向對象設計模式縱橫談三之Abstract Factory抽象工廠(建立型模式)

1、new的問題ide

常規的對象建立方法:ui

// 建立一個Road對象
Road road =  new Road();

 

new的問題:this

1)實現依賴,不能應對「具體實例化類型」的變化spa

 

解決思路:code

1)封裝變化點——哪裏有變化,就封裝哪裏對象

2)潛臺詞:若是沒有變化 ,固然不須要額外的封裝blog

 

2、工廠模式的緣起接口

1)變化點在「對象建立」,所以就封裝「對象建立」遊戲

2)面向接口編得不到——依賴接口,而非依賴實現ci

3)最簡單的解決方法:

class RoadFactory
{
     public  static Road CreateRoad()
    {
         return  new Road();
    }
}

class Program
{
     public  static  void Main( string[] args)
    {
         // 建立一個Road對象
        Road road = RoadFactory.CreateRoad();
    }
}

 

3、建立一系列相互依賴的對象

假設一個遊戲開發場景:

咱們須要構造「道路」、「房屋」、「地道」、「叢林」...等等對象

class RoadFactory
{
     public  static Road CreateRoad()
    {
         return  new Road();
    }

     public  static Building CreateBuilding()
    {
         return  new Building();
    }

     public  static Tunnel CreateTunnel()
    {
         return  new Tunnel();
    }

     public  static Jungle CreateJungle()
    {
         return  new Jungle();
    }
}

class Program
{
     public  static  void Main( string[] args)
    {
         // 建立一個Road對象
        Road road = RoadFactory.CreateRoad();

        Building building = RoadFactory.CreateBuilding();
        
        ....
    }
}

 

4、簡單工廠的問題

問題:

不能應對「不一樣系列對象」的變化。好比有不一樣風格的遊戲場景——對應不一樣風格的道路、房屋、地道...

解決:

使得面嚮對象的技術來「封裝」變化點

 

5、動機(Motivation)

在軟件系統中,常常面臨着「一系列相互依賴的對象」的建立工做;同時、因爲需求的變化,每每存在更多系列對象的建立工做。

如何應對這種變化?

如何繞過常規的對象建立方法(new),提供一種「封裝機制」來避免客戶程序和這種「多系統具體對象建立工做」的緊耦合?

 

6、意圖(Intent)

提供一個接口,讓該接口負責建立一系列「相關或者相互依賴的對象」,無需指定它們具體的類。

 

7、結構(Structure)

 

8、代碼示例

public  class Program
{
     public  static  void Main( string[] args)
    {
        GameManager gameManager =  new GameManager( new ModernFacilitiesFactory());
        gameManager.BulidGameFacilities();
        gameManager.Run();
    }
}

// 道路
public  abstract  class Road
{
    
}

// 房屋
public  abstract  class Building
{
    
}

// 地道
public  abstract  class Tunnel
{
    
}

// 叢林
public  abstract  class Jungle
{
    
}

// 設施
abstract  class FacilitiesFactory
{
     // 建立道路
     public  abstract Road CreateRoad();

     // 建立房屋
     public  abstract Building CreateBuilding();

     // 建立地道
     public  abstract Tunnel CreateTunnel();

     // 建立叢林
     public  abstract Jungle CreateJungle();
}

// 客戶程序
public  class GameManager
{
     private FacilitiesFactory facilitiesFactory;
     private Road road;
     private Building building;
     private Tunnel tunnel;
     private Jungle jungle;

     public GameManager(FacilitiesFactory facilitiesFactory)
    {
         this.facilitiesFactory = facilitiesFactory;
    }

     public  void BulidGameFacilities()
    {
        road = facilitiesFactory.CreateRoad();
        building = facilitiesFactory.CreateBuilding();
        tunnel = facilitiesFactory.CreateTunnel();
        jungle = facilitiesFactory.CreateJungle();
    }

     public  void Run()
    {
        
    }
}

// 道路
public  class ModernRoad : Road
{
    
}

// 房屋
public  class ModernBuilding : Building
{
    
}

// 地道
public  class ModernTunnel : Tunnel
{
    
}

// 叢林
public  class ModernJungle : Jungle
{
    
}

// 設施
public  class ModernFacilitiesFactory : FacilitiesFactory
{
     // 建立道路
     public  override Road CreateRoad()
    {
         return  new ModernRoad();
    }

     // 建立房屋
     public  override Building CreateBuilding()
    {
         return  new ModernBuilding();
    }

     // 建立地道
     public  override Tunnel CreateTunnel()
    {
         return  new ModernTunnel();
    }

     // 建立叢林
     public  override Jungle CreateJungle()
    {
         return  new ModernJungle();
    }
}

 

10、Abstract Factory模式的幾個要點

1)若是沒有應對「多系列對象構建」的需求變化,則沒有必要使用Abstract Factory模式,這時侯使用簡單的靜態工廠徹底能夠。

2)「系列對象」指的是這些對象之間有相互依賴、或做用的關係,例如遊戲開發場景中的「道路」與「房屋」 的依賴,「道路」與「地道」的依賴。

3)Abstract Factory模式主要在於應對「新系列」的需求變更。其缺點在於難以應付「新對象」的需求變更。

4)Abstract Factory模式常常和Factory Method模式共同組合來應對「對象建立」的需求變化。

相關文章
相關標籤/搜索