抽象工厂模式
1.抽象工厂的定义:
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
2.抽象工厂的结构和说明:
A,Abstract Factory: 抽象工厂,定义创建一系列产品对象的操作接口。
B,Concrete Factory: 具体的工厂,实现抽象工厂定义的方法,具体实现一系列产品对象的创建。
C,Abstract Product: 定义一类产品对象的接口。
D,Concrete Product: 具体的产品实现对象,通常在具体工厂里面,会选择具体的产品实现对象,
来创建符合抽象工厂定义的方法返回的产品类型的对象。
E,Client:客户端,主要使用抽象工厂来获取一系列所需要的产品对象,然后面向这些产品对象的接口编程,
以实现需要的功能。
3.模式实现
AbstractProductA.java
AbstractProductB.java
ProductA1.java
ProductA2.java
ProductB1.java
ProductB2.java
ConcreteFactory1.java
ConcreteFactory2.java
Client.java
4.思考抽象工厂
抽象工厂模式的本质:选择产品簇的实现
A, 抽象工厂模式的本质
工厂方法是选择单个产品的实现,虽然一个类里面可以有多个工厂方法,但是这些方法之间一般是没有联系的,即使看起来像有联系。但是抽象工厂着重的就是为一个产品簇选择实现,定义在抽象工厂 里面的方法通常是有联系的,它们都是产品的某一个部分或者相互依赖的。如果抽象工厂里面只定义一个方法,直接创建产品,那么就退化成为工厂方法了。
B,何时选用抽象工厂模式
建议在以下情况中选用抽象工厂模式:
B1,如果希望一个系统独立于它的产品的创建、组合和表示的时候。换句话说,希望一个系统只是知道产品的接口,而不关心实现的时候。
B2,如果一个系统要由多个产品系列中的一个来配置的时候。换句话说,就是可以动态地切换产品簇的时候。
B3,如果要强调一系列相关产品的接口,以便联合使用它们的时候。
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
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,如果要强调一系列相关产品的接口,以便联合使用它们的时候。