zoukankan      html  css  js  c++  java
  • 设计模式(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

  • 相关阅读:
    jqgrid自带多选与单选
    NPOI读写Excel【转载】
    C# 對 List<string> 取交集、補集、超集、串聯
    在前端解決顯示null值一例
    Linux netstat命令详解和使用例子(显示各种网络相关信息)
    Git 忽略規則及 .gitignore 規則不生效的辦法
    树莓派上传数据错误一例
    搭建本地SVN資料
    利用樹霉派採集溫濕度上傳到OneNET(非完整,僅參考)
    部署ASP.Net Core 2.1 項目到 IIS
  • 原文地址:https://www.cnblogs.com/zaevn00001/p/12612706.html
Copyright © 2011-2022 走看看