抽象工厂模式

来源:互联网 发布:淘宝旺旺名字怎么改 编辑:程序博客网 时间:2024/06/05 04:10
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和产品Baf.createProductA();af.createProductB();}}


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

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



0 0