设计模式(2)——抽象工厂模式的学习与案例演示

抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他子工厂的设计模式。该超级工厂又称为其他工厂的总工厂。这种类型的设计模式和工厂模式一样属于创建型模式,它提供了一种创建对象的最佳方式。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

介绍

意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

主要解决:主要解决接口选择的问题。

何时使用:系统的产品有多于一个的产品族,该产品族中可以抽出多个对象,而系统只消费其中某一族的产品。

如何解决:在一个产品族里面,定义多个产品。

关键代码:在一个工厂里聚合多个同类产品。

优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

使用场景: 1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。

注意事项:产品族难扩展,产品等级易扩展。

案例一(参考资料提供):

我们将创建 Shape 和 Color 接口和实现这些接口的实体类。下一步是创建抽象工厂类 AbstractFactory。接着定义工厂类 ShapeFactory 和 ColorFactory,这两个工厂类都是扩展了 AbstractFactory。然后创建一个工厂创造器/生成器类 FactoryProducer

AbstractFactoryPatternDemo,我们的演示类使用 FactoryProducer 来获取 AbstractFactory 对象。它将向 AbstractFactory 传递形状信息 ShapeCIRCLE / RECTANGLE / SQUARE),以便获取它所需对象的类型。同时它还向 AbstractFactory 传递颜色信息 ColorRED / 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

posted @ 2020-04-01 15:48  帝莘  阅读(228)  评论(0编辑  收藏  举报