本文共 4217 字,大约阅读时间需要 14 分钟。
《》讲了简单工厂模式,但是简单工厂模式存在一定的问题,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包-开放原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
抽象工厂模式(Abstract Factory Pattern)的定义:为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。
步骤 1为形状创建一个接口。Shape.javapublic interface Shape {void draw();}步骤 2创建实现接口的实体类。Rectangle.javapublic class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Inside Rectangle::draw() method.");}}Square.javapublic class Square implements Shape {@Overridepublic void draw() {System.out.println("Inside Square::draw() method.");}}Circle.javapublic class Circle implements Shape {@Overridepublic void draw() {System.out.println("Inside Circle::draw() method.");}}步骤 3为颜色创建一个接口。Color.javapublic interface Color {void fill();}步骤4创建实现接口的实体类。Red.javapublic class Red implements Color {@Overridepublic void fill() {System.out.println("Inside Red::fill() method.");}}Green.javapublic class Green implements Color {@Overridepublic void fill() {System.out.println("Inside Green::fill() method.");}}Blue.javapublic class Blue implements Color {@Overridepublic void fill() {System.out.println("Inside Blue::fill() method.");}}步骤 5为 Color 和 Shape 对象创建抽象类来获取工厂。AbstractFactory.javapublic abstract class AbstractFactory {abstract Color getColor(String color);abstract Shape getShape(String shape) ;}步骤 6创建扩展了 AbstractFactory 的工厂类,基于给定的信息生成实体类的对象。ShapeFactory.javapublic class ShapeFactory extends AbstractFactory {@Overridepublic Shape getShape(String shapeType){if(shapeType == null){return 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;}@OverrideColor getColor(String color) {return null;}}ColorFactory.javapublic class ColorFactory extends AbstractFactory {@Overridepublic Shape getShape(String shapeType){return null;}@OverrideColor 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;}}步骤 7创建一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂。FactoryProducer.javapublic 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;}}步骤 8使用 FactoryProducer 来获取 AbstractFactory,通过传递类型信息来获取实体类的对象。AbstractFactoryPatternDemo.javapublic 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 的 draw 方法shape2.draw();//获取颜色工厂AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");//获取颜色为 Red 的对象Color color1 = colorFactory.getColor("RED");//调用 Red 的 fill 方法color1.fill();}}步骤 9验证输出。Inside Circle::draw() method.Inside Rectangle::draw() method.Inside Red::fill() method.Inside Green::fill() method.
转载地址:http://dibuz.baihongyu.com/