一、定义
抽象工厂模式是利用一个超级工厂来创建其他工厂。该设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个生成别的对象的工厂,而不是生产指定的类。每个生成对象的工厂都按照工厂模式提供对象。
二、详细介绍
- 意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
- 解决问题:主要解决接口选择的问题。
- 使用场景:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
- 解决方式:在一个产品族里面,定义多个产品。
- 优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
- 缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
- 应用实例:1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。
三、实现
1、创建绘制形状的接口
/**
* desc: 创建形状的接口
* author: xuebin3765@163.com
* date: 2020/01/20
*/
public interface Shape {
public void draw();
}
2、创建实现绘制形状接口的实现类
/**
* desc: 画圆实体类
* @Author guodandan
* @Date 2020/1/18 16:58
*/
public class Circle implements Shape {
public void draw() {
System.out.println(":::::::: draw() ::: Circle");
}
}
/**
* desc: 画方实体类
* @Author guodandan
* @Date 2020/1/18 16:56
*/
public class Rectangle implements Shape {
public void draw() {
System.out.println(":::::::: draw() :: Rectangle");
}
}
3、创建设置颜色的接口
/**
* desc: 设置颜色接口
* author: xuebin3765@163.com
* date: 2020/01/25
*/
public interface Color {
public void show();
}
4、创建设置不同颜色的实现类
/**
* desc: 设置颜色为红色
* author: xuebin3765@163.com
* date: 2020/01/25
*/
public class Red implements Color {
@Override
public void show() {
System.out.println(":::::::: show() :: red");
}
}
/**
* desc: 设置颜色为绿色
* author: xuebin3765@163.com
* date: 2020/01/25
*/
public class Green implements Color {
@Override
public void show() {
System.out.println(":::::::: show() :: green");
}
}
5、为 Color 和 Shape 对象创建抽象类来获取工厂
/**
* desc: 抽象工厂
* author: xuebin3765@163.com
* date: 2020/01/20
*/
public abstract class AbstractFactory {
public abstract Color getColor(Class<? extends Color> clazz);
public abstract Shape getShape(Class<? extends Shape> clazz);
}
6、创建扩展了 AbstractFactory 的工厂类,基于给定的信息生成实体类的对象
/**
* desc: 抽象工厂实现类,实现颜色工厂对象的创建
* author: xuebin3765@163.com
* date: 2020/01/25
*/
public class ColorFactory extends AbstractFactory {
@Override
public Color getColor(Class<? extends Color> clazz) {
try {
return clazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
/**
* 通过反射,利用工厂模式实现目标实现类。
* 优点: 每次增加新的实例对象,不需要修改工厂方法,扩展性好
* @param clazz 目标类class
* @return 目标类
*/
@Override
public Shape getShape(Class<? extends Shape> clazz) {
return null;
}
}
package net.cxyk.ch02_asbFactory;
/**
* desc: 抽象工厂实现类,实现画图工厂对象的创建
* author: xuebin3765@163.com
* date: 2020/01/25
*/
public class ShapeFactory extends AbstractFactory {
@Override
public Color getColor(Class<? extends Color> clazz) {
return null;
}
/**
* 通过反射,利用工厂模式实现目标实现类。
* 优点: 每次增加新的实例对象,不需要修改工厂方法,扩展性好
* @param clazz 目标类class
* @return 目标类
*/
@Override
public Shape getShape(Class<? extends Shape> clazz) {
try {
return clazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}
7、创建一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂
/**
* desc: 创建一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂。
* author: xuebin3765@163.com
* date: 2020/01/26
*/
public class FactoryProducer {
public static AbstractFactory getFactory(Class<? extends AbstractFactory> clazz){
try {
return clazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}
8、测试类
import org.junit.Test;
/**
* desc:
* author: xuebin3765@163.com
* date: 2020/01/26
*/
public class TestAbstractFactory {
@Test
public void test(){
// 1、利用抽象工厂对象创建画图工厂对象
AbstractFactory shapeFactory = FactoryProducer.getFactory(ShapeFactory.class);
// 2、利用画图工厂对象创建画圆对象,并使用调用画图方法
Shape shape = shapeFactory.getShape(Circle.class);
shape.draw();;
// 3、利用画图工厂对象创建画方对象,并使用调用画图方法
shape = shapeFactory.getShape(Rectangle.class);
shape.draw();
// 4、利用抽象工厂对象创建颜色工厂对象
AbstractFactory colorFactory = FactoryProducer.getFactory(ColorFactory.class);
// 5、利用颜色工厂对象创建画红色对象,并调用方法设置颜色。
Color color = colorFactory.getColor(Red.class);
color.show();
// 6、利用颜色工厂对象创建画绿色对象,并调用方法设置颜色。
color = colorFactory.getColor(Green.class);
color.show();
}
}
9、测试结果
:::::::: draw() ::: Circle
:::::::: draw() :: Rectangle
:::::::: show() :: red
:::::::: show() :: green
10、更多内容