Abstract Factory Pattern 是围绕一个超级工厂创建其他工厂,也叫其他工厂的工厂。属于创建型模型,提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式的指定他们的类。每个生成的工都能按照工厂模式提供对象。
简介
目的:提供一系列相关或者相互依赖对象的接口,而无需指定它们具体的类。
解决:主要解决接口选择问题。
使用:系统的产品有多余一个的产品族,而系统只消费其中某一族的产品。
解决方案:在一个产品簇里面,定义多个产品。
关键代码:在一个工厂里聚合多个同类产品。
应用实例:服装套装……
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只是用一个产品族中的对象。
缺点:产品族扩展十分困难,要增加一个系列的某一产品,既要在抽象的 Creator 中加代码,又要在具体的里面加代码。
使用场景:1. QQ皮肤套装更换、2. 生成不同操作系统的程序;
注意事项:产品族扩展难,产品等级易扩展。
实现
创建 Shape 和 Color 接口和实现这些接口的实体类。创建抽象工厂类 AbstractFactory。定义工厂类 ShapeFactory 和 ColorFactory,这两个工厂类都是为了扩展 AbstractFactory。谭厚创建工厂生成器/创造器类 FactoryProducer。
AbstractFactoryPattermDemo 类使用 FactoryProducer 来获取 AbstractFactory 对象。它将向 AbstractFactory 传递形状信息 Shape(CIRCLE / RECTANGLE / SQUARE),以便获取其需要的对象的类型。同时它还向 AbstractFactory 传递颜色信息 Color(RED / GREEN / BLUE)以便获取它所需的对象类型。
步骤
为形状创建一个接口
public interface shape {void draw();}
创建实现接口的实体类
public class Rectangle implements shape {@Overridepublic void draw() {System.out.println("Inside Rectangle::draw() method.");}}
public class Square implement shape {@Overridepublic void draw() {System.out.println("Inside Square::draw() method.");}}
public class Circle implement shape {@Overridepublic void draw() {System.out.println("Inside Circle::draw() method.");}}
为颜色创建接口
public interface Color {void fill();}
创建实现接口的实体类
public class Red implements Color {@Overridepublic void fill() {System.out.println("Inside Red::fill() method.");}}
public class Green implements Color {@Overridepublic void fill() {System.out.println("Inside Green::fill() method.");}}
public class Blue implements Color {@Overridepublic void fill() {System.out.println("Inside Blue::fill() method.");}}
为 Color 和 Shape 对象创建抽象类来获取工厂
public abstract class AbstractFactory {public abstract Color getColor(String color);public abstract Shape getShape(String shape);}
创建扩展了 AbstractFactory 的工厂类,基于给定的信息生成实体类的对象
public class ShapeFactory extends AbstractFactory {@Overridepublic Shape getShape(String shapeType) {if(shapeType == null) {reurn null;}if(shapeType.equalsIgnoreCase("CIRCLE")) {return new Circle();} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {return new Rectangle();} else if (shapeType.equalsIgnoreCase("SQUARE")) {return new Square();}return null;}@Overridepublic Color getColor(String color) {return null;}}
public class ColorFactory extends AbstractFactory {@Overridepublic Shape getShape(String shapeType){return null;}@Overridepublic Color getColor(String color) {if(color == null){return null;}if(color.equalsIgnoreCase("RED")){return new Red();} else if(color.equalsIgnoreCase("GREEN")){return new Green();} else if(color.equalsIgnoreCase("BLUE")){return new Blue();}return null;}}
创建一个工厂创造器/生成器类,通过传递形状或者颜色色信息来获取工厂
public class FactoryProducer {public static AbstractFactory getFactory(String choice) {if(choice.equalsIgnoreCase("SHAPE")) {return new ShapeFactory();} else if(choice.equalsIgnoreCase("COLOR")) {return new ColorFactory();}return null;}}
使用 FactoryProducer 来获取 AbstractFactory,来传递类型信息获取实体类的对象
public class AbstractFactoryPatternDemo {public static void main(String [] args) {//获取形状工厂AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");//获取形状为 Circle 的对象Shape shape1 = shapeFactory.getshape("CIRCLE");//调用 Circle 的 draw 方法shape1.draw();//获取形状为 Rectangle 的对象Shape shape2 = shapeFactory.getshape("RECTANGLE");//调用形状为 Rectangle 的方法shape2.draw();//获取颜色工厂AbstractFactory colorFactory = FactoryProducer。getFactory("COLOR");//获取颜色为 Red 的对象Color color1 = colorFactory.getColor("RED");//调用颜色 Red 的 fill 方法Color1.fill();//获取颜色为 Green 的对象Color color2 = colorFactory.getColor("Green");//调用 Green 的 fill 方法color2.fill();//获取颜色为 Blue 的对象Color color3 = colorFactory.getColor("BLUE");//调用 Blue 的 fill 方法color3.fill();}}
输出结果
Inside Circle::draw() method.Inside Rectangle::draw() method.Inside Square::draw() method.Inside Red::fill() method.Inside Green::fill() method.Inside Blue::fill() method.
