工廠方法模式 - Factory Method Pattern
用途
處理在不指定對象具體類別的情況下建立對象的問題
classDiagram
  IProduct <|-- ConcreteProductA
  IProduct <|-- ConcreteProductB
  IFactory <|-- ConcreteFactoryA
  ConcreteProductA <.. ConcreteFactoryA
  ConcreteProductB <.. ConcreteFactoryB
  IFactory <|-- ConcreteFactoryB
  class IProduct{
    <<Interface>>
    +Make()
  }
  class ConcreteProductA{
    +Make()
  }
  class ConcreteProductB{
    +Make()
  }
  class IFactory{
    <<Interface>>
    +CreateProduct() IProduct
  }
  class ConcreteFactoryA{
    +CreateProduct() ConcreteProductA
  }
  class ConcreteFactoryB{
    +CreateProduct() ConcreteProductB
  }
例子
我們可以想像一個蛋糕店
 蛋糕店可以製作各種類型的蛋糕例如巧克力蛋糕、草莓蛋糕、檸檬蛋糕等
 每種蛋糕都有自己的製作方法和配方,但老闆不必知道如何製作每一種蛋糕
 相反,老闆將這個責任交給了不同的蛋糕師傅,每個蛋糕師傅專門負責製作一種蛋糕
Product
產品的抽象類別或介面,它定義了產品的共同屬性和方法
1
2
3
4
5
// 產品介面
public interface ICake
{
    void Make();
}
Concrete Product
產品的具體實現,例如巧克力蛋糕、草莓蛋糕等
每種蛋糕都實現了產品的介面,並提供了自己的製作方法和配方
1
2
3
4
5
6
7
8
// 具體產品:巧克力蛋糕
public class ChocolateCake : ICake
{
    public void Make()
    {
        Console.WriteLine("製作巧克力蛋糕");
    }
}
1
2
3
4
5
6
7
8
// 具體產品:草莓蛋糕
public class StrawberryCake : ICake
{
    public void Make()
    {
        Console.WriteLine("製作草莓蛋糕");
    }
}
Factory
工廠的抽象類別或介面,它定義了製造產品的方法
這個方法可以根據需要返回不同的具體產品
1
2
3
4
5
// 工廠介面
public interface ICakeFactory
{
    ICake CreateCake();
}
Concrete Factory
工廠的具體實現,它實現了製造產品的方法
每個具體工廠專門負責製作一種特定的產品
1
2
3
4
5
6
7
8
// 具體工廠:巧克力蛋糕工廠
public class ChocolateCakeFactory : ICakeFactory
{
    public ICake CreateCake()
    {
        return new ChocolateCake();
    }
}
1
2
3
4
5
6
7
8
// 具體工廠:草莓蛋糕工廠
class StrawberryCakeFactory : ICakeFactory
{
    public ICake CreateCake()
    {
        return new StrawberryCake();
    }
}
Client
創建工廠以製作蛋糕
1
2
3
4
5
6
7
8
9
10
11
// 創建巧克力蛋糕工廠
ICakeFactory chocolateFactory = new ChocolateCakeFactory();
// 使用巧克力蛋糕工廠製作蛋糕
ICake chocolateCake = chocolateFactory.CreateCake();
chocolateCake.Make();
// 創建草莓蛋糕工廠
ICakeFactory strawberryFactory = new StrawberryCakeFactory();
// 使用草莓蛋糕工廠製作蛋糕
ICake strawberryCake = strawberryFactory.CreateCake();
strawberryCake.Make();
延伸
 本文章以  CC BY 4.0  授權