创建型模式 - 抽象工厂(创建产品族)
抽象工厂
1. 介绍
抽象工厂是对工厂模式的抽象,抽象工厂为客户提供接口,使客户在不必指定具体产品以及它们的关联关系情况下,创建产品族中多个产品对象。
如果没有抽象工厂,当一个产品方案包含一系列关联子产品时,会难以控制:需要针对每种方案事先定义好需要的产品组合,而且调用者不得不需要知道具体的类、如何创建具体的类,以及他们之间的关联关系。
而有了抽象工厂后,只需要通过工厂生成器传入响应的产生,告诉用户需要什么,就能创建出对应的产品方案,无需用户参与创建的过程,也不需要知道具体的产品类。
2. 意图
提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
3. 示例
现在用户想创建填充颜色的形状,用户只想制定形状、颜色等基本信息,而不想关注具体如何创建形状对象和颜色对象,以及它们之间是如何关联到一起的。
4. UML类图
5. 演示代码
- 创建Shape接口
// Shape.java
public interface Shape{
void draw();
}
- 创建实现Shape接口的实体类
// Rectangle.java
public class Rectangle implements Shape{
@override
public void draw(){
System.out.println("Rectangle::draw() method");
}
}
// Square.java
public class Sqaure implements Shape {
@override
public void draw() {
System.out.println("Square::draw() method");
}
}
// Circle.java
public class Circle implements Shape {
@override
public void draw() {
System.out.println("Circle::draw() method");
}
}
- 创建Color接口
// Color.java
public interface Color{
void fill();
}
- 创建实现Color接口的实体类
// Red.java
public class Red implements Color {
@override
void fill() {
System.out.prinln("Red::fill() method");
}
}
// Green.java
public class Green implements Color {
@override
void fill() {
System.out.prinln("Green::fill() method");
}
}
// Blue.java
public class Blueimplements Color {
@override
void fill() {
System.out.prinln("Blue::fill() method");
}
}
- 为Color和Shape对象创建抽象类来获取工厂
// AbstractFactory
public abstract class AbstractFactory {
public abstract Shape getShape(String s);
public abstract Color getColor(String s);
}
- 实现抽象工厂类ShapeFactory, ColorFactory
// ShapeFactory
public class ShapeFactory extends AbstractFactory {
@Override
public Shape getShape(String s) {
if(s == null) return null;
else if(s.equalsIgnoreCase("Circle") )
return new Shape();
else if(s.equalsIgnoreCase("RECTANGLE"))
return new Rectangle();
else if(s.equalsIgnoreCase("SQUARE"))
return new Square();
return null;
}
}
// ColorFactory.java
public class ColorFactory extends AbstractFactory {
@Override
public Color getColor(String s) {
if(s == null) return null;
else if(s.equalsIgnoreCase("RED") )
return new Red();
else if(s.equalsIgnoreCase("GREEN"))
return new Green();
else if(s.equalsIgnoreCase("BLUE"))
return new Blue();
return null;
}
}
- 创建工厂创造器,通过传递 形状或颜色信息来获取工厂
// FactoryProducer.java
public class FactoryProducer {
public static AbstractFactory getFactory(String choice) {
if(choice.equalsIgnoreCase("SHAPE")) return new ShapeFactory();
else if(choice.equalsIgnoreCase("COLOR")) return new ColorFactory();
retur null;
}
}
- 使用FactoryProducer来获取AbstractFactory,通过传递类型信息来获取实体类的对象
// AbstractFactoryPatternDemo.java
public class AbstractFactoryPatternDemo {
public static void main(String[] args) {
AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");
Shape shape1 = shapeFactory.getShape("CIRCLE);
shape1.draw();
Shape shape2 = shapeFactory.getShape("RECTANGLE");
shape2.draw();
Shape shape3 = shapeFactory.getShape("SQUARE");
shape3.draw();
AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");
Color color1 = colorFactory.getColor("RED");
color1.fill();
Color color2 = colorFactory.getColor("GREEN");
color2.fill();
Color color3 = colorFactory.getColor("BLUE");
color3.fill();
}
}
- 运行结果
inner Circle::draw() methond
inner Rectangle::draw() methond
inner Square::draw() methond
inner Red::fill() method
inner Green::fill() method
inner Blue::fill() method