zoukankan      html  css  js  c++  java
  • 抽象工厂模式(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();
    		}
    	}
    
  • 相关阅读:
    Redis Pipeline原理分析
    python 装饰器,传递类以及参数
    q
    Redis的EXPIRE过期机制介绍
    z
    julia .文档
    julia 安装
    python 弧度与角度互转
    python 角度和弧度转化
    机器人行业中我们常说的roll、yaw、pitch是什么?
  • 原文地址:https://www.cnblogs.com/LoveTomato/p/8342952.html
Copyright © 2011-2022 走看看