文章

工廠方法模式 - 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 授權