zoukankan      html  css  js  c++  java
  • 设计模式-抽象工厂模式

    一、定义

    抽象工厂模式(Abstract Factory Pattern)是一种比较常见的模式,其定义如下:

    Provide an interface for creating families of related or dependent objects without specifying their concrete classes.(为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。)

    抽象工厂模式的通用类图为:

    抽象工厂模式的通用类图

    //抽象产品类
    public abstract class AbstractProductA {
        public void shareMethod() {
            //每个产品共有的方法
        }
        
        //每个产品相同方法,不同实现
        public abstract void doSomething();
    }
    
    //产品A1的实现类
    public class ProductA1 extends AbstractProductA {
        public void doSomething() {
            System.out.println("产品A1的实现方法");
        }
    }
    
    //产品A2的实现类
    public class ProductA2 extends AbstractProductA {
        public void doSomething() {
            System.out.println("产品A2的实现方法");
        }
    }
    
    //抽象工厂类
    public abstract class AbstractCreator {
        public abstract AbstractProductA createProductA();
        
        public abstract AbstractProductB createProductB();
    }
    
    //产品等级1的实现类
    public class Creator1 extends AbstractCreator {
        public AbstractProductA createProductA {
            return new ProductA1();
        }
        
        public AbstractProductB createProductB() {
            return new ProductB1();
        }
    }
    
    //产品等级2的实现类
    public class Creator2 extends AbstractCreator{
        public AbstractProductA createProductA() {
            return new ProductA2();
        }
        
        public AbstractProductB createProductB() {
            return new ProductB2();
        }
    }
    

    注意:有M个产品就应该有M个实现工厂类,在每个实现工厂中,实现不同产品族的生成任务。

    public class Client {
       public static void main(String[] args) {
           AbstractCreator creator1 = new Creator1();
           AbstractCreator creator2 = new Creator2();
           
           AbstractProductA a1 = creator1.createProductA();
           AbstractProductA a2 = creator2.createProductA();
           AbstractProductB b1 = creator1.createProductB();
           AbstractProductB b2 = creator2.createProductB();
       }
    }
    

    二、应用

    2.1 优点

    • 封装性,每个产品的实现类不是高层模块要关心的,他要关心的是接口,是抽象,他不关心对象是如何创建出来。这是由工厂类负责的,只要知道工厂类是谁,我就能创建出一个需要需要的对象。
    • 产品族内的约束为非公开状态。

    2.2 缺点

    最大缺点就是产品族扩展非常困难。如果我们要增加一个产品,抽象类AbstractCreator要增加一个方法,然后两个实现类都要修改,这违背了开闭原则。

    2.3 使用场景

    一个对象族(或是一组没有任何关系的对象)都有相同的约束,就可以使用抽象工厂模式。例如一个文本编辑器和一个图片处理器,都是软件实体。但是*nixd下的文本编辑器和windows下的文本编辑器虽然功能和界面都相同,但是代码实现不同,图片处理器也有类似情况。也就是具备了相同的约束条件:操作系统类型。于是我们可以使用抽象工厂模式,产生不同操作系统下的编辑器和图片处理器。

  • 相关阅读:
    DOM中元素节点、属性节点、文本节点的理解
    vue3+ts +vant 从0搭建移动端架子
    (转)一位软件工程师的6年总结
    tabcontrol的alignment属性设置成Right时,tabPage的text内容不能显示的问题<转>
    已知两点,画过两点的直线
    索引器
    SQL中 非 简体中文排序出现乱码的问题
    group by 列 聚合函数 where having
    SQL存储过程及事务
    使用C#创建Windows服务
  • 原文地址:https://www.cnblogs.com/f-zhao/p/6196819.html
Copyright © 2011-2022 走看看