不管哪一種工廠模式,都是用工廠的概念,實現物件創建的一種模式,而且要處理在不指定對象具體類別的情況下建立對象的問題。

簡單工廠模式

1)又稱為靜態工廠模式,一般來說同一工廠內所產生的類別會有一個共同的父類別或介面。
2)簡單工廠會依據傳入的參數,回傳不同的物件。使用者取得物件的時候只要傳入正確的參數,不需要去理解這個工廠物件。

simple-factory-pattern.png

public class Factory
{
	public Car CreateCar(string type)
	{
		return type switch
		{
			"SUV" => new SUVCar(),
			"Jeep" => new JeepCar(),
			"Sports" => new SportsCar(),
			_ => throw new NotImplementedException(),
		};
	}
}
public abstract class Car
{
	protected Car(string type)
	{
		Type = type;
	}

	public string Brand { get; set; } = "";
	public string Type { get; set; } = "";

	public abstract string GetName();
}

public class SUVCar : Car
{
    public SUVCar() : base("SUV")
    {
        Brand = "BMW";
    }

    public override string GetName()
    {
        return $"{this.Brand} {this.Type}";
    }
}

public class JeepCar : Car
{
    public JeepCar() : base("Jeep")
    {
        Brand = "BMW";
    }

    public override string GetName()
    {
        return $"{this.Brand} {this.Type}";
    }
}

public class SportsCar : Car
{
    public SportsCar() : base("Sports")
    {
        Brand = "BMW";
    }

    public override string GetName()
    {
        return $"{this.Brand} {this.Type}";
    }
}
public void Test1()
{
	Factory factory = new Factory();

	var car1 = factory.CreateCar("SUV");
	Debug.WriteLine(car1.GetName());

	var car2 = factory.CreateCar("Jeep");
	Debug.WriteLine(car2.GetName());

	var car3 = factory.CreateCar("Sports");
	Debug.WriteLine(car3.GetName());
}
BMW SUV
BMW Jeep
BMW Sports

缺點:新增產品時,必須修改工廠類別裡面的程式碼,不符合設計模式的(開放/封閉)原則

工廠模式

將簡單工廠的工廠抽象化(改成介面),只規範要回傳的基底類別。 實際上要製作的產品則交給具有該介面的實體工廠(Concrete Factory)來實作。

factory-pattern.png

public interface IFactory
{
	public Car CreateCar();
}

public class SUVFactory : IFactory
{
	public Car CreateCar()
	{
		return new SUVCar();
	}
}

public class JeepFactory : IFactory
{
	public Car CreateCar()
	{
		return new JeepCar();
	}
}

public class SportsFactory : IFactory
{
	public Car CreateCar()
	{
		return new SportsCar();
	}
}
public void Test1()
{
	IFactory suvfactory = new SUVFactory();
	var car1 = suvfactory.CreateCar();
	Debug.WriteLine(car1.GetName());

	IFactory jeepfactory = new JeepFactory();
	var car2 = jeepfactory.CreateCar();
	Debug.WriteLine(car2.GetName());

	IFactory sportsFactory = new SportsFactory();
	var car3 = sportsFactory.CreateCar();
	Debug.WriteLine(car3.GetName());
}

優點:新增產品時,不用修改原有的工廠類別,只要新增實體工廠類別即可。
缺點:新增產品時,必須不停的新增實體工廠類別,且每個實體工廠類別只能生產一種產品。

抽象工廠模式

抽象工廠將一組具有同一主題的單獨工廠封裝起來,但實際上要製作的產品仍交由實體工廠(Concrete Factory)來實作。

abstract-factory-pattern.png

public interface IFactory
{
	public SUVCar CreateSUVCar();

	public JeepCar CreateJeepCar();

	public SportsCar CreateSportsCar();
}

public class CarFactory : IFactory
{
	public SUVCar CreateSUVCar()
	{
		return new SUVCar();
	}

	public JeepCar CreateJeepCar()
	{
		return new JeepCar();
	}

	public SportsCar CreateSportsCar()
	{
		return new SportsCar();
	}
}
public void Test1()
{
	CarFactory carFactory = new CarFactory();

	var car1 = carFactory.CreateSUVCar();
	Debug.WriteLine(car1.GetName());

	var car2 = carFactory.CreateJeepCar();
	Debug.WriteLine(car2.GetName());

	var car3 = carFactory.CreateSportsCar();
	Debug.WriteLine(car3.GetName());
}