您的位置:首页 > 其它

23种设计模式之抽象工厂模式

2015-06-23 16:07 330 查看
抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种,业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。

1抽象产品类

public  abstract class AbstractProductA {
	//每个产品共有的方法
	public void shareMethod(){}
	//每个产品相同方法,不同实现
	public abstract void doSomething();

}


产品A1的实现类

public class ProductA1 extends AbstractProductA{

	@Override
	public void doSomething() {
		// TODO Auto-generated method stub
		System.out.println("产品A1的实现方法");
	}

}
产品A2的实现类

public class ProductA2 extends AbstractProductA{

	@Override
	public void doSomething() {
		// TODO Auto-generated method stub
		System.out.println("产品A2的实现方法");
	}

}
产品B与此类似,不再赘述。抽象工厂类AbstractCreator的职责是定义每个工厂要实现的功能,我们定义了两个产品代码如下:

抽象工厂类

public abstract class AbstractCreator {
	//创建A产品家族
	public abstract AbstractProductA createProductA();
	//创建B产品家族
	public abstract AbstractProductB createProductB();

}
注意: 有N个产品族,在抽象工厂类中就应该有N个抽象方法。

如何创建一个产品,则是由具体的实现类来完成的呢,代码如下:

产品等级1的实现类:

public class Creator1 extends AbstractCreator{
//只生产产品等级为1的A产品
	@Override
	public AbstractProductA createProductA() {
		// TODO Auto-generated method stub
		return new ProductA1();
	}
//只生产产品等级为1的B产品
	@Override
	public AbstractProductB createProductB() {
		// TODO Auto-generated method stub
		return new ProductB1();
	}

}
产品等级2的实现类:

public class Creator2 extends AbstractCreator{
//只生产产品等级为1的A产品
	@Override
	public AbstractProductA createProductA() {
		// TODO Auto-generated method stub
		return new ProductA2();
	}
//只生产产品等级为2的B产品
	@Override
	public AbstractProductB createProductB() {
		// TODO Auto-generated method stub
		return new ProductB2();
	}

}


注意:有M个产品等级就应该有M个实现工厂类,在每个实现工厂中、实现不同的产品族的生产任务。

场景类:

public class Client {
	public static void main(String[] args){
		//定义出两个工厂
		AbstractCreator creator1 = new Creator1();
		AbstractCreator creator2 = new Creator2();
		//产生A1对象
		AbstractProductA a1 = creator1.createProductA();
		//产生A2对象
		AbstractProductA a2 = creator2.createProductA();
		//产生B1对象
		AbstractProductB b1 = creator1.createProductB();
		//产生B2对象
		AbstractProductB b2 = creator2.createProductB();
		
		/**
		 * do Something
		 */
	}

}


在场景类中,没有任何一个方法与实现类有关系的,对于一个产品来说,我们只要知道它的工厂方法就可以直接生产一个产品对象,无需关心它的实现类。

~~~~~~抽象工厂模式的优点:

封装性。每个产品的实现类不是高层模块要关心的,它要关心的是什么?是接口,是抽象,它不关心对象是如何创建出来的,它是由谁负责的,工厂类只需要知道工厂类是谁,我就能创建出一个需要的对象,省时省力。

~~~~~~缺点:

抽象工厂模式的最大缺点就是产品族扩展非常困难。如果要增加一个产品C,也就是说产品家族由原来的两个增加到三个,抽象类要增加一个方法createProductC(); 然后实现类都要修改,违反了开闭原则。而且我们一直说明抽象类和接口是一个契约,改变契约,所有与契约有关系的代码都要修改,那么这段代码叫有毒代码。

抽象 工厂使用的场景:

抽象工厂模式使用的场景定义非常简单呢,一个对象族都有相同的约束,则可以使用抽象工厂模式。

什么意思呢?例如:一个文本编辑器和一个图像编辑器,都是软件的实体。但是linux下的文本编辑器和windows下的文本编辑器虽然功能和界面都相同,但是代码实现就是不同的,图片处理器也有类似情况,也就是具有了共同的约束条件,操作系统类型。于是我们可以使用抽象工厂模式,产生不同的操作系统下的文本编辑器和图片处理器。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: