抽象工厂模式

1.抽象工厂的定义:                                                                                                                                         
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

2.抽象工厂的结构和说明:
A,Abstract Factory: 抽象工厂,定义创建一系列产品对象的操作接口。
B,Concrete Factory: 具体的工厂,实现抽象工厂定义的方法,具体实现一系列产品对象的创建。
C,Abstract Product: 定义一类产品对象的接口。
D,Concrete Product: 具体的产品实现对象,通常在具体工厂里面,会选择具体的产品实现对象,
来创建符合抽象工厂定义的方法返回的产品类型的对象。
E,Client:客户端,主要使用抽象工厂来获取一系列所需要的产品对象,然后面向这些产品对象的接口编程,
以实现需要的功能。

3.模式实现

AbstractFactory.java

package com.java.pattern.abstractfactory;

/**
 * 抽象工厂的接口,声明创建抽象产品对象的操作
 */
public interface AbstractFactory {

	/**
	 * 创建抽象产品A的对象
	 * 
	 * @return
	 */
	public AbstractProductA createProductA();

	/**
	 * 创建抽象产品B的对象
	 * 
	 * @return
	 */
	public AbstractProductB createProductB();

}

AbstractProductA.java

package com.java.pattern.abstractfactory;

/**
 * 抽象产品A的接口
 * 
 */
public interface AbstractProductA {

}

AbstractProductB.java

package com.java.pattern.abstractfactory;

/**
 * 抽象产品B的接口
 * 
 */
public interface AbstractProductB {

}

ProductA1.java

package com.java.pattern.abstractfactory;

/**
 * 产品A的具体实现
 */
public class ProductA1 implements AbstractProductA {

}

ProductA2.java

package com.java.pattern.abstractfactory;

/**
 * 产品A的具体实现
 */
public class ProductA2 implements AbstractProductA {

}

ProductB1.java

package com.java.pattern.abstractfactory;

/**
 * 产品B的具体实现
 */
public class ProductB1 implements AbstractProductB {

}

ProductB2.java

package com.java.pattern.abstractfactory;

/**
 * 产品B的具体实现
 */
public class ProductB2 implements AbstractProductB {

}

ConcreteFactory1.java

/**
 * 具体的工厂实现对象,实现创建具体的产品对象的操作
 * 
 */
public class ConcreteFactory1 implements AbstractFactory {

	public AbstractProductA createProductA() {
		return new ProductA1();
	}

	public AbstractProductB createProductB() {
		return new ProductB1();
	}
}

ConcreteFactory2.java

package com.java.pattern.abstractfactory;

/**
 * 具体的工厂实现对象,实现创建具体的产品对象的操作
 * 
 */
public class ConcreteFactory2 implements AbstractFactory {

	public AbstractProductA createProductA() {
		return new ProductA2();
	}

	public AbstractProductB createProductB() {
		return new ProductB2();
	}
}

Client.java

package com.java.pattern.abstractfactory;

public class Client {
	public static void main(String[] args) {
		// 创建抽象工厂对象
		AbstractFactory af = new ConcreteFactory1();
		// 通过抽象工厂来获取一系列的对象,如产品A和产品B
		af.createProductA();
		af.createProductB();
	}
}


4.思考抽象工厂
抽象工厂模式的本质:选择产品簇的实现
A, 抽象工厂模式的本质
工厂方法是选择单个产品的实现,虽然一个类里面可以有多个工厂方法,但是这些方法之间一般是没有联系的,即使看起来像有联系。但是抽象工厂着重的就是为一个产品簇选择实现,定义在抽象工厂 里面的方法通常是有联系的,它们都是产品的某一个部分或者相互依赖的。如果抽象工厂里面只定义一个方法,直接创建产品,那么就退化成为工厂方法了。

B,何时选用抽象工厂模式
建议在以下情况中选用抽象工厂模式:
B1,如果希望一个系统独立于它的产品的创建、组合和表示的时候。换句话说,希望一个系统只是知道产品的接口,而不关心实现的时候。
B2,如果一个系统要由多个产品系列中的一个来配置的时候。换句话说,就是可以动态地切换产品簇的时候。
B3,如果要强调一系列相关产品的接口,以便联合使用它们的时候。



posted @ 2016-08-20 13:27  行走的思想  阅读(5)  评论(0编辑  收藏  举报  来源