设计模式04_抽象工厂模式

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/46440915



抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广。




抽象工厂模式与工厂方法模式的最大差别就在于工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则须要面对多个产品等级结构。



如果一个子系统须要一些产品对象,而这些产品又属于一个以上的产品等级结构。

那么为了将消费这些产品对象的责任和创建这些产品对象的责任切割开来。能够引进抽象工厂模式。

这种话。消费产品的一方不须要直接參与产品的创建工作,而仅仅须要向一个公用的工厂接口请求所须要的产品。


长处:

(1)分离接口和实现
client使用抽象工厂来创建须要的对象,而client根本就不知道详细的实现是谁,client仅仅是面向产品的接口编程而已。也就是说,client从详细的产品实现中解耦。

(2)使切换产品族变得easy
由于一个详细的工厂实现代表的是一个产品族,比方上面样例的从A产品到B产品仅仅须要切换一下详细工厂。



缺点:
(1)不太easy扩展新的产品
假设须要给整个产品族加入一个新的产品,那么就须要改动抽象工厂,这样就会导致改动全部的工厂实现类。



通过以下代码来熟悉抽象工厂模式:


不同的抽象工厂:

package com.design.abstractFactory;

//每一种牌子的产品负责生产工厂。即不同的厂商负责自己牌子的生产
public abstract class Factory1 {
	abstract public IproductA getproductA1();
	abstract public IproductB getProductB1();
}
package com.design.abstractFactory;

public abstract class Factory2 {
	abstract public IproductA getproductA2();
	abstract public IproductB getproductB2();
}

不同的详细工厂:

package com.design.abstractFactory;

//详细的工厂生产产品
public class ConcreateFactory1 extends Factory1 {

	@Override
	public IproductA getproductA1() {
		return new ProductA1();
	}

	@Override
	public IproductB getProductB1() {
		return new ProductB1();
	}

}
package com.design.abstractFactory;

public class ConcreateFactory2  extends Factory2{

	@Override
	public IproductA getproductA2() {
		return new ProductA2();
	}

	@Override
	public IproductB getproductB2() {
		return new ProductB2();
	}
}

定义不同的产品接口:

package com.design.abstractFactory;
//定义不同的产品之间的一定具备的标准,用interface实现 
public interface IproductA {
	public void method();
}
package com.design.abstractFactory;

public interface IproductB {
	public void method();
}

不同的详细产品:

package com.design.abstractFactory;

//实现了产品标准实现的一系列详细产品
public class ProductA1 implements IproductA {

	@Override
	public void method() {
		System.err.println("A1产品生产A1");
	}

}
package com.design.abstractFactory;

public class ProductA2 implements IproductA {

	@Override
	public void method() {
		System.err.println("A2生产产品A2");
	}

}

package com.design.abstractFactory;

public class ProductB1 implements IproductB {
	@Override
	public void method() {
		System.err.println("B1生产产品B1");
	}
}
package com.design.abstractFactory;

public class ProductB2 implements IproductB {
	@Override
	public void method() {
		System.err.println("B2生产产品B2");
	}
}

client实现:

package com.design.abstractFactory;

public class Client {
	public static void main(String[] args) {

		Factory1 factory = new ConcreateFactory1();

		IproductA a1 = factory.getproductA1();

		IproductB b1 = factory.getProductB1();

		a1.method();

		b1.method();

	}
}

測试结果:


A1产品生产A1
B1生产产品B1





本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5090638.html,如需转载请自行联系原作者


上一篇:3分钟短文:任命管理员,给Laravel普通用户提权


下一篇:nginx配置访问密码,实现用户输入用户名密码才能访