设计模式学习03—抽象工厂模式

设计模式学习03—抽象工厂模式

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

1、动机与定义

     工厂模式中,一个工厂仅仅能提供一个或一类产品,当产品种类较多,形成产品系列(比方我们要创建跨平台的button,菜单,文本框等等一系列GUI控件:
     
设计模式学习03—抽象工厂模式

     单纯使用工厂模式会产生大量工厂,并且后期维护也不方便,我们能够从产品中找到规律,假设产品等级相对固定,以后仅仅会新增产品族,那么我们就能够把整个产品族放到一个工厂创建,以后新增其它系统产品族也很方便,例如以下图:
     
设计模式学习03—抽象工厂模式

     这样的模式就是抽象工厂,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则须要面对多个产品等级结构,一个工厂等级结构能够负责多个不同产品等级结构中的产品对象的创建 。

2、结构与类图

     通用类图例如以下:
设计模式学习03—抽象工厂模式
     文字开头那个创建GUI的样例类图例如以下,此处仅仅创建了Button和TextArea:

     
设计模式学习03—抽象工厂模式

     产品类和接口代码例如以下(为了演示方便,省略逻辑等等):

interface Button {

}

interface TextArea {

}

class WindowButton implements Button {

}

class LinuxButton implements Button {

}

class WindowTextArea implements TextArea {

}

class LinuxTextArea implements TextArea {

}

     
工厂类代码:

public interface IGuiFactory {
    // 产品Button创建方法
    Button createButton();

    // 产品TextArea创建方法
    TextArea createTextArea();

    // 有n个产品等级,就n个创建方法
}

class LinuxGuiFactory implements IGuiFactory {

    @Override
    public Button createButton() {
        return new LinuxButton();
    }

    @Override
    public TextArea createTextArea() {
        return new LinuxTextArea();
    }
}

class WindowsGuiFactory implements IGuiFactory {

    @Override
    public Button createButton() {
        return new WindowButton();
    }

    @Override
    public TextArea createTextArea() {
        return new WindowTextArea();
    }

}

 
     
client代码:

public class Client {

    public static void main(String[] args) {
        // 为了演示,使用new方式创建工厂,最好做成单例的或先初始化好
        IGuiFactory factory = new WindowsGuiFactory();
        Button button = factory.createButton();
        TextArea textArea = factory.createTextArea();
        System. out.println(button);
        System. out.println(textArea);
    }
}

     
有多少个产品族,就创建多少个工厂实现,有多少个产品等级,工厂中就要对外提供多少个创建产品方法。


3、适用场景及效果(优缺点)

     
事实上工厂模式的长处,抽象工厂基本都有的,这里说说抽象工厂特有的长处:
     1、约束产品族内部元素,能够控制产品族内部各产品间关系,数量等,比方产品族内的产品有A、B,须要生产1个A时生成2个B,此时由于他们都在一个工厂实现类中,所以很easy控制。
     2、扩展产品族和工厂很easy,比方上面样例中要扩展一类系统GUI,比方说android的,添加�一套GUI控件和android的控件工厂即可。
     3、降低client推断,当一个产品族中的产品放到一起工作时,抽象工厂能确保client始终仅仅是用同一个产品族中的产品,而不用依据当前环境推断使用哪个产品了,比方使用了WindowsGuiFactory,使用控件时,client全然不用推断是哪种操作系统了,仅仅须要用WindowsGuiFactory获取即可了。
     缺点也是显而易见的,最大缺点就是扩展产品等级很困难,还是上面的样例,要新增一种控件,要把全部的工厂都要加一个方法,严重违反了开闭原则,改动接口,全部client代码也要影响,所以抽象工厂一定要确保产品等级无变化或很少的变化。
     事实上这也是设计上的一种权衡,有的时候要想让一方面扩展、使用很easy,就会导致还有一方面很难扩展,假设业务上有这种倾斜性,我们就能够做这种设计,没有绝对好的设计,仅仅有适合的设计。
     适用场景,当系统所提供的工厂所需生产的详细产品并非一个简单的对象,而是多个位于不同产品等级结构中属于不同类型的详细产品时我们会考虑使用抽象工厂模式。结合上面的优缺点,举几个详细的适用场景:
     1、系统中有1个或多个产品族时,而每次仅仅是用1个产品族,如有些桌面程序须要更换主题,皮肤等功能;
     2、系统提供一个产品类的库时,全部产品以接口方式出现,能够考虑使用抽象工厂;
     3、系统同一类产品族要放到一起使用,关联到一起这样的约束最好在设计中体现,能够使用抽象工厂。

4、模式扩展

     1、工厂模式转化,当产品等级仅仅有1个时,抽象工厂能够退化成普通工厂,假设实现比較简单,产品类不多时,普通工厂退化成简单工厂。
     2、工厂组合,抽象工厂、普通工厂当产品过多时,都会生成非常多工厂类,能够考虑使用简单工厂再将工厂类封装一下,client获取工厂时也会更方便。事实上,工厂模式是程序中用的最广的一种模式,常常和其它模式组合使用,没有哪个模式能100%使用某个环境,仅仅有模式的灵活变通,多模式混合才会产生优秀的设计。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118849.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Spring中的设计模式[通俗易懂]

    Spring中的设计模式[通俗易懂]Spring中的设计模式

    2022年4月23日
    37
  • 设计模式之代理模式XXOO

    设计模式之代理模式XXOO定义代理模式可以分为两种,一种是静态代理,一种是动态代理。静态代理:代理类一般会持有一个被代理的对象引用,且对于不关心的方法全部委托给被代理的对象处理。自己处理关心的方法。这种代理方式是死板的,它不是在运行时动态创建,它就是硬编码,你代码编译前写的是什么,编译后就是什么。换句话就是你按下CTRL+S的那一刻,就会被代理对象生成一个不可动态改变的代理类。静态代理一般对于代理的对象是单个或者多个固定的类(数量不会太多)使用。效果会比动态代理要好。动态代理:动态代理又分为JDK动

    2022年7月17日
    14
  • 极速理解设计模式系列:14.轻量级模式(Flyweight Pattern)「建议收藏」

    极速理解设计模式系列:14.轻量级模式(Flyweight Pattern)

    2022年3月8日
    46
  • Java常用设计模式

    Java常用设计模式一、设计模式概念1、定义​Java包含23种设计模式,是一套对代码设计经验的总结,被人们反复利用,多人熟知的代码设计方式。2、目的​为了提高代码的可读性,可扩展性以及代码的复用性,为了解决在写代码过程中遇到的代码设计问题。3、设计模式的六大原则​3.1开闭原则​对扩展开放,对修改关闭(尽可能对代码少修改)​3.2里氏替换原则​它是面向对象基本原则之一,任何父类(基类)出现的地方,子类都可以出现,也就是子类可以替换父类的任何功能(体现了父类的可扩展性)3.3依赖

    2022年7月8日
    25
  • 设计模式——门面模式「建议收藏」

    设计模式——门面模式「建议收藏」今天我们继续来学习前面没有学完的结构型设计模式中的一种:门面模式。门面模式也是一种不太常用的设计模式。所以,我们今天依旧是了解为主,暂时不去深入的学习。概述门面模式:(FacadeDesignPattern)门面模式也叫外观模式,门面模式为子系统提供一组统一的接口,定义一组高层接口让子系统更易用。门面模式原理和实现也比较简单,应用场景也比较明确,主要在接口设计方面使用。何时使用:解决易用性问题。解决性能问题。解决分布式事务问题。UML类图:角色组成:门面角色:客户端调用这个

    2025年6月6日
    5
  • 装饰器设计模式

    装饰器设计模式

    2021年9月16日
    61

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号