标签:
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该工厂又称为其他工厂的工厂。在此模式中,接口负责创建一个相关对象的工厂,不需要显式指定它们的类,每个生成的工厂都能按照工厂模式提供对象。
介绍
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
主要解决:主要解决接口选择的问题。
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
如何解决:在一个产品族里,定义多个产品。
关键代码:在一个工厂里聚合多个同类产品。
应用实例:衣服有商务装(成套,一系列具体产品)、时尚装(成套,一系列具体产品),某一个衣柜(具体工厂)只能存放某一种这样的衣服。所有的衣柜都是衣柜类的(抽象工厂)某一个,而某一套衣服又包含具体的上衣(某具体产品),裤子等。这些具体的上衣其实也都是上衣(抽象产品),具体的裤子也都是裤子(另一抽象产品)。
优点:当一个产品族里的多个对象被设计为一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展困难,要增加一个系列的某一产品,既要在抽象的Creator里加代码,又要在具体的里面加代码。
使用场景:1.QQ换皮肤,一整套一起换。2.生成不同操作系统的程序。
注意事项:产品族难扩展,产品等级易扩展。
实现:
将创建Shape和Color接口和实现这些接口的实体类。下一步是创建抽象工厂类AbstractFactory,接着定义工厂类ShapeFactory和ColorFactory,它们都扩展了AbastrctFactory。然后创建一个工厂创造器FactoryProducer。
步骤1
为形状创建一个接口。
Shape.java
1 public interface Shape{ 2 3 void draw(); 4 5 }
步骤2
创建实现接口的实现类。
Rectangle.java
1 public class Rectangle implements Shape { 2 3 public void draw() { 4 5 System.out.println("Inside Rectangle:draw() method."); 6 7 } 8 9 }
Square.java
1 public class Square implements Shape { 2 3 public void draw() { 4 5 System.out.println("Inside Square:draw() method."); 6 7 } 8 9 }
Circle.java
1 public class Circle implements Shape { 2 3 public void draw() { 4 5 System.out.println("Inside Circle:draw() method."); 6 7 } 8 9 }
步骤3
为颜色创建一个接口。
Color.java
1 public interface Color { 2 3 void fill(); 4 5 }
步骤4
创建实现接口的实体类
Red.java
1 public class Red implements Color { 2 3 public void fill() { 4 5 System.out.println("Inside Red::fill() method."); 6 7 } 8 9 }
Green.java
1 public class Green implements Color { 2 3 public void fill() { 4 5 System.out.println("Inside Green::fill() method."); 6 7 } 8 9 }
Blue.java
1 public class Blue implements Color { 2 3 public void fill() { 4 5 System.out.println("Inside Blue::fill() method."); 6 7 } 8 9 }
步骤5
为Color和Shape对象创建抽象类来获取工厂。
AbstractFactory.java
1 public abstract class AbstractFactory { 2 3 abstract Color getColor(String color); 4 5 abstract Shape getShape(String shape); 6 7 }
步骤6
创建扩展了AbstractFactory的工厂类,基于给定的信息生成实体类的对象。
1 public class ShapeFactory extends AbstractFactory{ 2 3 public Shape getShape(String ShapeType) { 4 5 if(ShapeType == null) { 6 7 return null; 8 9 } 10 11 if(ShapeType.equalsIgnoreCase("CIRCLE")) { 12 13 return new Circle(); 14 15 }else if (ShapeType.equalsIgnoreCase("RECTANGLE")) { 16 17 return new Rectangle(); 18 19 }else if (ShapeType.equalsIgnoreCase("SQUARE")) { 20 21 return new Square(); 22 23 } 24 25 else { 26 27 return null; 28 29 } 30 31 } 32 33 public Color getColor(String color) { 34 35 return null; 36 37 } 38 39 }
ColorFactory.java
1 public class ColorFactory extends AbstractFactory { 2 3 public Shape getShape(String shapeType){ 4 5 return null; 6 7 } 8 9 public Color getColor(String color) { 10 11 if(color == null) { 12 13 return null; 14 15 } 16 17 if(color.equalsIgnoreCase("RED")) { 18 19 return new Red(); 20 21 }else if(color.equalsIgnoreCase("GREEN")){ 22 23 return new Green(); 24 25 }else if(color.equalsIgnoreCase("BLUE")) { 26 27 return new Blue(); 28 29 } 30 31 return null; 32 33 } 34 35 }
步骤7
创建一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂。
1 public class FactoryProducer { 2 3 public static AbstractFactory getFactory(String choice) { 4 5 if(choice.equalsIgnoreCase("SHAPE")) { 6 7 return new ShapeFactory(); 8 9 }else if(choice.equalsIgnoreCase("COLOR")) { 10 11 return new ColorFactory(); 12 13 } 14 15 return null; 16 17 } 18 19 }
步骤8
使用FactoryProducer来获取AbstractFactory, 通过传递类型信息来获取实体类的对象。
AbstractFactoryPatternDemo.java
1 public class AbstractFactoryPatternDemo{ 2 3 public static void main(String[] args) { 4 5 //获取形状工厂 6 7 AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE"); 8 9 //获取形状为circle的对象 10 11 Shape shape1 = shapeFactory.getShape("CIRCLE"); 12 13 shape1.draw(); 14 15 //获取形状为Rectangle的对象 16 17 Shape shape2 = shapeFactory.getShape("RECTANGLE"); 18 19 shape2.draw(); 20 21 //获取形状为Square的对象 22 23 Shape shape3 = shapeFactory.getShape("SQUARE"); 24 25 shape3.draw(); 26 27 //获取颜色工厂 28 29 AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR"); 30 31 //获取颜色为Red的对象 32 33 Color color1 = colorFactory.getColor("RED"); 34 35 color1.fill(); 36 37 //获取颜色为Green的对象 38 39 Color color2 = colorFactory.getColor("GREEN"); 40 41 color2.fill(); 42 43 //获取颜色为Blue的对象 44 45 Color color3 = colorFactory.getColor("BLUE"); 46 47 color3.fill(); 48 49 } 50 51 }
标签:
原文地址:http://www.cnblogs.com/darrensun/p/4657278.html