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下的文本编辑器虽然功能和界面都相同,但是代码实现不同,图片处理器也有类似情况。也就是具备了相同的约束条件:操作系统类型。于是我们可以使用抽象工厂模式,产生不同操作系统下的编辑器和图片处理器。

  • 相关阅读:
    在IIS上搭建WebSocket服务器(三)
    在IIS上搭建WebSocket服务器(二)
    在IIS上搭建WebSocket服务器(一)
    RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->Web版本模块管理界面新增模块排序功能
    C#在WinForm中使用WebKit传递js对象实现与网页交互的方法
    c#用webkit内核支持html5
    .NET下WebBrowser的一个BUG以及其替代品——geckofx
    HTML5浏览器嵌入窗口程序解决方案
    saprk里面的action
    解释为什么word2vec也被称作deep learning
  • 原文地址:https://www.cnblogs.com/f-zhao/p/6196819.html
Copyright © 2011-2022 走看看