• 抽象工厂模式(Abstract factory pattern)


    定义

    抽象工厂模式(英语:Abstract factory pattern)是一种软件开发设计模式。抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。客户端程序不需要知道(或关心)它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的通用接口。抽象工厂模式将一组对象的实现细节与他们的一般使用分离开来。

    类图

    从类图上我们看出相对工厂方法这里多了抽象产品族,而工厂多了创建多出产品族的方法,下面看看java代码实现

    java代码实现

    抽象产品

    public interface ProductA {
        void run();
    }
    
    public interface ProductB {
        void run();
    }
    

    具体产品

    public class ProductA1 implements ProductA {
        @Override
        public void run() {
            System.out.println("beaz1 run");
        }
    }
    
    public class ProductB1 implements ProductB {
        @Override
        public void run() {
            System.out.println("bmw1 run");
        }
    }
    

    抽象工厂

    public interface Creator {
        ProductA creatorProductA();
    
        ProductB creatorProductB();
    }
    

    具体工厂

    public class Creator1 implements Creator {
        @Override
        public ProductA creatorProductA() {
            return new ProductA1();
        }
    
        @Override
        public ProductB creatorProductB() {
            return new ProductB1();
        }
    }
    

    实例

    看了上面这些类,大家是不有点想起了我们常用的List,就是这种结构。来看看List源码

    public interface List<E> extends Collection<E> {
    
        Iterator<E> iterator();
    
        ListIterator<E> listIterator();
    }
    

    这两个方法是不是正好是抽象工厂构建不同产品的方法呢,然而ArrayList,LinkedList正是具体的工厂,在他们内部有这两个抽象产品IteratorListIterator的具体实现。

    总结

    设计原则:遵循单一职责、依赖倒置、开闭原则

    常用场景:需要一个接口可以提供一个产品族,且不必知道产品的具体种类

    使用概率:30%

    复杂度:中

    变化点:工厂与产品的种类

    选择关键点:产品族是否需要一起提供,且是否有一致的接口

    逆鳞:无

    相关设计模式

    建造者模式:两者都是建造一批对象或者说产品,不同的是两者的目的和实现手段,在建造者模式中,是为了复用对象的构建过程而定义了一个指挥者,而在抽象工厂模式中,是为了提供一个这批对象的创建接口而定义了抽象工厂接口。

  • 相关阅读:
    Javascript MVC学习杂记3
    Backbone.js 0.9.2 源码分析收藏
    Javascript MVC学习杂记2
    Javascript MVC学习杂记1
    C语言string.h中常用字符函数介绍
    10点网页设计要注意的细节
    js日期函数
    结合回调函数介绍下泛型函数
    【转载】互斥量和信号量的区别
    设计模式之Singleton
  • 原文地址:https://www.cnblogs.com/learningchencheng/p/7717355.html
Copyright © 2020-2023  润新知