抽象工厂模式(Abstract Factory)

模式定义

抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
与工厂模式区别:抽象工厂模式中的工厂类负责创建多种相关产品,工厂模式中的工厂类只负责创建一种产品。

关联定义

产品等级结构 继承于同一抽象类的产品
例如:一个抽象类型是电视机,其子类有海尔电视机、海信电视机、TCL电视机
则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,
抽象电视机是父类,而具体品牌的电视机是其子类。

产品族 由同一工厂类生产的产品
如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,
海尔电冰箱位于电冰箱产品等级结构中。

UML类图

• AbstractFactory:抽象工厂 生成各种产品的接口
• ConcreteFactory:具体工厂 实现了抽象工厂接口,生成的产品构成了一个产品族,每一个产品都位于某个产品等级结构中
• AbstractProduct:抽象产品 产品的抽象业务方法
• Product:具体产品 具体工厂生产的具体产品对象,实现抽象产品接口中定义的业务方法。

代码结构

	public static class AbstractFactoryAPP
	{
		public static void Run()
		{
			AbstractFactory factory1 = new ConcreteFactory1();
			AbstractProductA productA1 = factory1.CreateProductA();
			AbstractProductB productB1 = factory1.CreateProductB();
			productB1.Interact(productA1);
		}
	}

	public abstract class AbstractProductA
	{ }

	public class ProductA1 : AbstractProductA
	{ }

	public class ProductA2 : AbstractProductA
	{ }

	public abstract class AbstractProductB
	{
		public abstract void Interact(AbstractProductA a);
	}

	public class ProductB1 : AbstractProductB
	{
		public override void Interact(AbstractProductA a)
		{
			Console.WriteLine(this.GetType().Name + " interacts with " + a.GetType().Name);
		}
	}

	public class ProductB2 : AbstractProductB
	{
		public override void Interact(AbstractProductA a)
		{
			Console.WriteLine(this.GetType().Name + " interacts with " + a.GetType().Name);
		}
	}

	public abstract class AbstractFactory
	{
		public abstract AbstractProductA CreateProductA();
		public abstract AbstractProductB CreateProductB();
	}

	public class ConcreteFactory1:AbstractFactory
	{
		public override AbstractProductA CreateProductA()
		{
			return new ProductA1();
		}
		public override AbstractProductB CreateProductB()
		{
			return new ProductB1();
		}
	}
	public class ConcreteFactory2 : AbstractFactory
	{
		public override AbstractProductA CreateProductA()
		{
			return new ProductA2();
		}
		public override AbstractProductB CreateProductB()
		{
			return new ProductB2();
		}
	}

情景案例

现在好多公司都在做自己的生态圈,好像只要利润的产品都生产(比如做手机的非要造汽车)。本例子举海尔与美的两家电器商,海尔与美的都生产冰箱与空调。冰箱、空调为抽象产品,海尔、美的为两个具体工厂。

	public static class AbstractFactoryAPP
	{
		public static void Run()
		{
			Company haier = new HaierCompany();
			AirConditioner productA1 = haier.CreateProductA();
			Refrigerator productB1 = haier.CreateProductB();
			productB1.Interact(productA1);
		}
	}

	public abstract class AirConditioner
	{ }

	public class HaierAir : AirConditioner
	{ }

	public class MideaAir : AirConditioner
	{ }

	public abstract class Refrigerator
	{
		public abstract void Interact(AirConditioner a);
	}

	public class HaierRefrigerator : Refrigerator
	{
		public override void Interact(AirConditioner a)
		{
			Console.WriteLine(this.GetType().Name + " interacts with " + a.GetType().Name);
		}
	}

	public class MideaRefrigerator : Refrigerator
	{
		public override void Interact(AirConditioner a)
		{
			Console.WriteLine(this.GetType().Name + " interacts with " + a.GetType().Name);
		}
	}

	public abstract class Company
	{
		public abstract AirConditioner CreateProductA();
		public abstract Refrigerator CreateProductB();
	}

	public class HaierCompany : Company
	{
		public override AirConditioner CreateProductA()
		{
			return new HaierAir();
		}
		public override Refrigerator CreateProductB()
		{
			return new HaierRefrigerator();
		}
	}
	public class MediaCompany : Company
	{
		public override AirConditioner CreateProductA()
		{
			return new MideaAir();
		}
		public override Refrigerator CreateProductB()
		{
			return new MideaRefrigerator();
		}
	}
原文地址:https://www.cnblogs.com/LoveTomato/p/8342952.html