Creational Patterns Part 2/5: Abstract Factory Pattern
2016-05-30 20:47
411 查看
Creational Patterns Part 2/5: Abstract Factory Pattern
目录
Creational Patterns Part 25 Abstract Factory Pattern目录
Definition
UML Class Diagram
Implementation
Definition
Abstract Factory相当于一个超级工厂,这个工厂可以创建工厂,真可谓工厂的工厂。在Abstract Factory Pattern中,有多个方法,每个方法产生一个工厂,每个产生的工厂又可以创建多个对象(Factory Pattern)。
何时使用?当希望可以同时控制几种对象的创建的时候,而Factory Pattern只可以控制一种对象的创建
使用频率:
High
UML Class Diagram
Implementation
在示例中Abstract Factory可以创建ShapeFactory和ColorFactory,然后再由两种工厂去创建各自的对象。用户根本不知道(不关心)对象是如何创建的。// Shape.java package designpatterns.creationalpatterns.abstractfactory; public interface Shape { void draw(); } // Color.java package designpatterns.creationalpatterns.abstractfactory; public interface Color { void fill(); } // ShapeImpl.java package designpatterns.creationalpatterns.abstractfactory; class Circle implements Shape { @Override public void draw() { System.out.println("Circle::draw()"); } } class Rectangle implements Shape { @Override public void draw() { System.out.println("Rectangle::draw()"); } } class Square implements Shape { @Override public void draw() { System.out.println("Shape::draw()"); } } // ColorImpl.java package designpatterns.creationalpatterns.abstractfactory; class Red implements Color { @Override public void fill() { System.out.println("Red::fill()"); } } class Green implements Color { @Override public void fill() { System.out.println("Green::fill()"); } } class Blue implements Color { @Override public void fill() { System.out.println("Blue::fill()"); } } // AbstracFactory.java package designpatterns.creationalpatterns.abstractfactory; abstract class AbstractFactory { abstract Shape getShape(String shape); abstract Color getColor(String color); } class ShapeFactory extends AbstractFactory { @Override Shape getShape(String shapeType) { if (shapeType == null) return null; if (shapeType.equalsIgnoreCase("CIRCLE")) { return new Circle(); } else if (shapeType.equalsIgnoreCase("SQUARE")) { return new Square(); } else if (shapeType.equalsIgnoreCase("RECTANGLE")) { return new Rectangle(); } return null; } @Override Color getColor(String color) { return null; } } class ColorFactory extends AbstractFactory { @Override Shape getShape(String shapeType) { return null; } @Override 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; } } // AbstractFactoryDemo.java package designpatterns.creationalpatterns.abstractfactory; public class AbstractFactoryDemo { public static void main(String[] args) { AbstractFactory absf = FactoryProduct.getFactory("Shape"); Shape shape = null; shape = absf.getShape("Circle"); shape.draw(); shape = absf.getShape("Square"); shape.draw(); shape = absf.getShape("Rectangle"); shape.draw(); System.out.println("================="); absf = FactoryProduct.getFactory("Color"); Color color = null; color = absf.getColor("Red"); color.fill(); color = absf.getColor("Green"); color.fill(); color = absf.getColor("Blue"); color.fill(); } } class FactoryProduct { public static AbstractFactory getFactory(String factory) { if(factory.equalsIgnoreCase("SHAPE")) { return new ShapeFactory(); } else if(factory.equalsIgnoreCase("COLOR")) { return new ColorFactory(); } return null; } } // output Circle::draw() Shape::draw() Rectangle::draw() ================= Red::fill() Green::fill() Blue::fill()
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解
- 实例解析C#设计模式编程中简单工厂模式的使用
- 详解C#设计模式编程中生成器模式的使用
- 深入解析C#设计模式编程中对建造者模式的运用