创建型-2-抽象工厂模式( Abstract Factory Pattern )
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂
1该超级工厂又称为其他工厂的工厂 2 3在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类 4 5每个生成的工厂都能按照工厂模式提供对象 6 7抽象工厂模式属于创建型模式,它提供了一种创建对象的最佳方式。
摘要
1、意图:
1提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
2、主要解决:
1主要解决接口选择的问题
3、何时使用:
1系统的产品有多于一个的产品族,而系统只消费其中某一族的产品
4、如何解决:
1在一个产品族里面,定义多个产品
5、关键代码:
1在一个工厂里聚合多个同类产品
6、应用实例:
1工作了,为了参加一些聚会,肯定有两套或多套衣服吧,比如说有商务装(成套,一系列具体产品)、时尚装(成套,一系列具体产品),甚至对于一个家庭来说,可能有商务女装、商务男装、时尚女装、时尚男装,这些也都是成套的,即一系列具体产品 2 3假设一种情况(现实中是不存在的,要不然,没法进入了,但有利于说明抽象工厂模式),在您的家中,某一个衣柜(具体工厂)只能存放某一种这样的衣服(成套,一系列具体产品),每次拿这种成套的衣服时也自然要从这个衣柜中取出了 4 5用 OO 的思想去理解,所有的衣柜(具体工厂)都是衣柜类的(抽象工厂)某一个,而每一件成套的衣服又包括具体的上衣(某一具体产品),裤子(某一具体产品),这些具体的上衣其实也都是上衣(抽象产品),具体的裤子也都是裤子(另一个抽象产品)
7、优点:
1当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
8、缺点:
1产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 `Creator` 里加代码,又要在具体的里面加代码
9、使用场景:
11、`QQ` 换皮肤,一整套一起换 22、生成不同操作系统的程序
10、注意事项:
1产品族难扩展,产品等级易扩展
实现

1、创建 Shape 和 Color 接口和实现这些接口的实体类
2、创建抽象工厂类 AbstractFactory
3、定义工厂类 ShapeFactory 和 ColorFactory ,这两个工厂类都是扩展了 AbstractFactory
4、创建一个工厂创造器/生成器类 FactoryProducer
5、AbstractFactoryPatternDemo 使用 FactoryProducer 来获取 AbstractFactory 对象
它将向 AbstractFactory 传递形状信息 Shape ( CIRCLE / RECTANGLE / SQUARE ),以便获取它所需对象的类型
同时它还向 AbstractFactory 传递颜色信息 Color ( RED / GREEN / BLUE ),以便获取它所需对象的类型
范例
1. 为形状创建一个接口
Shape.java
1public interface Shape { 2 void draw(); 3}
2. 创建实现接口的实体类
Rectangle.java
1package com.ycbbs.tech.gof; 2 3 4public class Rectangle implements Shape { 5 6 @Override 7 public void draw() { 8 System.out.println("Inside Rectangle::draw() method."); 9 } 10}
Square.java
1 2package com.ycbbs.tech.gof; 3 4 5public class Square implements Shape { 6 7 @Override 8 public void draw() { 9 System.out.println("Inside Square::draw() method."); 10 } 11}
Circle.java
1 2package com.ycbbs.tech.gof; 3 4 5public class Circle implements Shape { 6 7 @Override 8 public void draw() { 9 System.out.println("Inside Circle::draw() method."); 10 } 11}
3. 为颜色创建一个接口
Color.java
1 2package com.ycbbs.tech.gof; 3 4 5public interface Color { 6 void fill(); 7}
4. 创建实现颜色接口的实体类
Red.java
1 2package com.ycbbs.tech.gof; 3 4 5public class Red implements Color { 6 7 @Override 8 public void fill() { 9 System.out.println("Inside Red::fill() method."); 10 } 11}
Green.java
1 2package com.ycbbs.tech.gof; 3 4 5public class Green implements Color { 6 7 @Override 8 public void fill() { 9 System.out.println("Inside Green::fill() method."); 10 } 11}
Blue.java
1 2package com.ycbbs.tech.gof; 3 4 5public class Blue implements Color { 6 7 @Override 8 public void fill() { 9 System.out.println("Inside Blue::fill() method."); 10 } 11}
5. 为 Color 和 Shape 对象创建抽象类来获取工厂
AbstractFactory.java
1 2package com.ycbbs.tech.gof; 3 4 5public abstract class AbstractFactory { 6 abstract Color getColor(String color); 7 abstract Shape getShape(String shape) ; 8}
6. 创建扩展了 AbstractFactory 的工厂类,基于给定的信息生成实体类的对象
ShapeFactory.java
1 2package com.ycbbs.tech.gof; 3 4 5public class ShapeFactory extends AbstractFactory { 6 7 @Override 8 public Shape getShape(String shapeType){ 9 if(shapeType == null){ 10 return null; 11 } 12 if(shapeType.equalsIgnoreCase("CIRCLE")){ 13 return new Circle(); 14 } else if(shapeType.equalsIgnoreCase("RECTANGLE")){ 15 return new Rectangle(); 16 } else if(shapeType.equalsIgnoreCase("SQUARE")){ 17 return new Square(); 18 } 19 return null; 20 } 21 22 @Override 23 Color getColor(String color) { 24 return null; 25 } 26}
ColorFactory.java
1 2package com.ycbbs.tech.gof; 3 4 5public class ColorFactory extends AbstractFactory { 6 7 @Override 8 public Shape getShape(String shapeType){ 9 return null; 10 } 11 12 @Override 13 Color getColor(String color) { 14 if(color == null){ 15 return null; 16 } 17 if(color.equalsIgnoreCase("RED")){ 18 return new Red(); 19 } else if(color.equalsIgnoreCase("GREEN")){ 20 return new Green(); 21 } else if(color.equalsIgnoreCase("BLUE")){ 22 return new Blue(); 23 } 24 return null; 25 } 26}
7. 创建一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂
FactoryProducer.java
1 2package com.ycbbs.tech.gof; 3 4 5public class FactoryProducer { 6 public static AbstractFactory getFactory(String choice){ 7 if(choice.equalsIgnoreCase("SHAPE")){ 8 return new ShapeFactory(); 9 } else if(choice.equalsIgnoreCase("COLOR")){ 10 return new ColorFactory(); 11 } 12 return null; 13 } 14}
8. 使用 FactoryProducer 来获取 AbstractFactory,通过传递类型信息来获取实体类的对象
AbstractFactoryPatternDemo.java
1 2package com.ycbbs.tech.gof; 3 4 5public class AbstractFactoryPatternDemo { 6 public static void main(String[] args) { 7 8 //获取形状工厂 9 AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE"); 10 11 //获取形状为 Circle 的对象 12 Shape shape1 = shapeFactory.getShape("CIRCLE"); 13 14 //调用 Circle 的 draw 方法 15 shape1.draw(); 16 17 //获取形状为 Rectangle 的对象 18 Shape shape2 = shapeFactory.getShape("RECTANGLE"); 19 20 //调用 Rectangle 的 draw 方法 21 shape2.draw(); 22 23 //获取形状为 Square 的对象 24 Shape shape3 = shapeFactory.getShape("SQUARE"); 25 26 //调用 Square 的 draw 方法 27 shape3.draw(); 28 29 //获取颜色工厂 30 AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR"); 31 32 //获取颜色为 Red 的对象 33 Color color1 = colorFactory.getColor("RED"); 34 35 //调用 Red 的 fill 方法 36 color1.fill(); 37 38 //获取颜色为 Green 的对象 39 Color color2 = colorFactory.getColor("Green"); 40 41 //调用 Green 的 fill 方法 42 color2.fill(); 43 44 //获取颜色为 Blue 的对象 45 Color color3 = colorFactory.getColor("BLUE"); 46 47 //调用 Blue 的 fill 方法 48 color3.fill(); 49 } 50}
编译运行以上 Java 范例,输出结果如下
1Inside Circle::draw() method. 2Inside Rectangle::draw() method. 3Inside Square::draw() method. 4Inside Red::fill() method. 5Inside Green::fill() method. 6Inside Blue::fill() method.