设计模式-抽象工厂(Abstract Factory)

简述

  抽象工厂是创建型模式,在软件设计过程当中,它使用得非常普遍并且在解耦对象的创建时是最佳的选择,但是初学者(像我)会感觉到为什么把一段创建对象的代码搞得那么复杂繁琐,但是抽象工厂这样的开销在大型的系统项目中是相当有用的,对代码维护和管理上将带来前所未有的方便。

功能

  提供创建对象的接口。

何处使用

  当然在哪里使用它这个才是我们学习的目的。可以打一个比方,当我们需要玩PC游戏时,必须要相关装备比如说一台性能优秀的电脑、准确灵敏的鼠标和键盘、拥有HiFi效果的音箱、或许还需要一个舒适的座椅和电脑桌子,这一系列的东西都需要买来并且组装起来,这样就成了我们梦寐以求的游戏室。

  Ok需要的器材清单已经列好了,我们需要一个一个购买然后组装。当然不同的玩家每个人的要求不一样,骨灰级玩家可能需要顶级配置的电脑以及功能灵敏度最好的鼠标和键盘之类的,但是初级玩家可能只需要一台主流电脑,至于鼠标键盘原配就足以。如此看来他们所需要的东西类别都一样,只是配置价格或者外观等不一样而已,当然电脑的组装大家都知道它们拥有相同的接口,组装过程也相同。

  如此看来抽象工厂将在此会发挥巨大作用,当初始化这些配件时可以在各自的配件类中完成,只要它是继承自一个抽象配件类,抽象工厂也会按照这些抽象配件的规则来装配。当有新的配置清单时只需要新增一个工厂车间来选择配件库的配件来组装就可以满足新用户的需求。看来抽象工程它是由产品仓库工厂车间组成,我们可以新增产品同样也可以新增工厂车间,从而满足不同的需求。

  当系统越来越复杂庞大时,需要抽象工厂来帮我们完成如此复杂的装配工作,当客户选中不同的Pc部件想自定义自己的游戏室时,看来使用抽象工厂会让我们的工作相当的容易和有条理。

设计

  如此一来我们知道将要达到什么样的效果了,设计起来也是相当容易的,以产品和工厂的关系为例:

 AbstractFactory

实现

 知道了自己将要做什么,并且将整个过程设计出来,接下来就要将按照设计图纸完成自己要达到的目的,进入编码工作,这是一个需要基本功和耐心的工作。接下来看下代码部分,这些代码是出自某本书,感谢那本书的作者提供代码:

public class Client 
{
	private AbstractProductA AbstractProductA; 
	private AbstractProductB AbstractProductB; 
	public Client(AbstractFactory factory) 
	{ 
		AbstractProductB = factory.CreateProductB();
		AbstractProductA = factory.CreateProductA(); 
	} 
	public void Run() 
	{ 
		AbstractProductB.Interact(AbstractProductA); 
	} 
}

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 abstract class AbstractProductA { }

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

public class ProductA1: AbstractProductA { }

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

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

  想要实现抽象工厂我们必须要做到以下两点:

  1. 拥有众多类的产品库
  2. 拥有组装产品的组装车间

To be continued! @ Design Patterns

posted @ 2010-09-20 00:08  佳佳李  阅读(1804)  评论(10编辑  收藏  举报