抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他子工厂的设计模式。该超级工厂又称为其他工厂的总工厂。这种类型的设计模式和工厂模式一样属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
介绍
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
主要解决:主要解决接口选择的问题。
何时使用:系统的产品有多于一个的产品族,该产品族中可以抽出多个对象,而系统只消费其中某一族的产品。
如何解决:在一个产品族里面,定义多个产品。
关键代码:在一个工厂里聚合多个同类产品。
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
使用场景: 1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。
注意事项:产品族难扩展,产品等级易扩展。
案例一(参考资料提供):
我们将创建 Shape 和 Color 接口和实现这些接口的实体类。下一步是创建抽象工厂类 AbstractFactory。接着定义工厂类 ShapeFactory 和 ColorFactory,这两个工厂类都是扩展了 AbstractFactory。然后创建一个工厂创造器/生成器类 FactoryProducer。
AbstractFactoryPatternDemo,我们的演示类使用 FactoryProducer 来获取 AbstractFactory 对象。它将向 AbstractFactory 传递形状信息 Shape(CIRCLE / RECTANGLE / SQUARE),以便获取它所需对象的类型。同时它还向 AbstractFactory 传递颜色信息 Color(RED / GREEN / BLUE),以便获取它所需对象的类型。
案例二(小编自己撰写):
背景:假设对于衣服来言,从衣服种类上,你可以划分出鞋子,T恤,西装裤,从衣服颜色上,你可以划分为红色,黄色,绿色,蓝色,假如我们仅仅根据衣服种类生成一个对象的情况下,我们无法准确判断,比如我晚会要穿西装裤,但是我的西装裤有蓝色和黑色,那我究竟选择的是哪一条呢?因为我们还需要实例化一个颜色。
我将创建Closing和Color接口和实现这些接口的实体类。然后创建一个总的抽象工厂类AbstractFactory,以及定义它的子工厂类ClosingFactory和ColorFactory,这两个工厂类都是扩展了抽象工厂类,然后需要创建一个FactoryProducer(工厂创造器)
代码步骤:
一、创建Closing接口以及实现该接口的实体类
1 public interface Closing { 2 void party(); 3 }
1 public class TShirt implements Closing { 2 @Override 3 public void party() { 4 System.out.println("I am T-shirt"); 5 } 6 }
1 public class Hat implements Closing { 2 @Override 3 public void party() { 4 System.out.println("I am hat"); 5 } 6 }
二、创建Color接口以及其实现类
1 public interface Color { 2 void party(); 3 }
1 public class Red implements Color { 2 @Override 3 public void party() { 4 System.out.println("I am red"); 5 } 6 }
1 public class Green implements Color { 2 @Override 3 public void party() { 4 System.out.println("I am Green"); 5 } 6 }
三、创建抽象工厂总类以及两个子工厂类
1 public abstract class AbstractFactory { 2 public abstract Color getColor(String type); 3 public abstract Closing getClosing(String type); 4 }
1 public class ClosingFactory extends AbstractFactory { 2 @Override 3 public Color getColor(String type) { 4 return null; 5 } 6 7 @Override 8 public Closing getClosing(String type) { 9 if(type.equalsIgnoreCase("tshirt")){ 10 return new TShirt(); 11 }else if(type.equalsIgnoreCase("hat")){ 12 return new Hat(); 13 } 14 return null; 15 } 16 }
1 public class ColorFactory extends AbstractFactory { 2 @Override 3 public Color getColor(String type) { 4 if(type.equalsIgnoreCase("red")){ 5 return new Red(); 6 }else if(type.equalsIgnoreCase("green")){ 7 return new Green(); 8 } 9 return null; 10 } 11 12 @Override 13 public Closing getClosing(String type) { 14 return null; 15 } 16 }
四、创建工厂生成器
1 public class FactoryProducer { 2 public static AbstractFactory getFactory(String choice){ 3 if(choice.equalsIgnoreCase("Color")){ 4 return new ColorFactory(); 5 }else if(choice.equalsIgnoreCase("closing")){ 6 return new ClosingFactory(); 7 } 8 return null; 9 } 10 }
五、测试我们的抽象工厂方法
1 public class FactoryTest { 2 public static void main(String[] args) { 3 AbstractFactory closingFactory = FactoryProducer.getFactory("closing"); 4 Closing tshirt = closingFactory.getClosing("tshirt"); 5 tshirt.party(); 6 Closing hat = closingFactory.getClosing("hat"); 7 hat.party(); 8 9 AbstractFactory colorFactory = FactoryProducer.getFactory("color"); 10 Color red = colorFactory.getColor("red"); 11 red.party(); 12 Color green = colorFactory.getColor("green"); 13 green.party(); 14 } 15 }
六、打印输出结果
I am T-shirt I am hat I am red I am Green
参考资料来源:https://www.runoob.com/design-pattern/abstract-factory-pattern.html