设计模式学习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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 深入理解设计模式之建造者模式

    深入理解设计模式之建造者模式老大突然拉住我,喜滋滋地告诉我:“公司很满意我们做的模型,又签订了一个合同,把奔驰、宝马的车辆模型都交给我们公司制作了,不过这次额外增加了一个新需求:汽车的启动、停止、喇叭声音、引擎声音都由客户自己控制,想什么顺序就什么顺序”那我们开始设计,来看一下类图:类图比较简单,在CarModel中我们定义了一个setSequence方法,车辆模型的这几个动作要如何排布,是在这个ArrayList中定义的。然后run()方法根据sequence定义的顺序完成指定的顺序动作。我们来看模型抽象类代码:

    2025年6月25日
    6
  • 十二、适配器模式——解决充电的烦恼 #和设计模式一起旅行#

    轻轻的我走了, 正如我轻轻的来; 我轻轻的招手, 作别西天的云彩。 ——徐志摩 《再别康桥》故事背景把奶茶店盘了出去,我和设计模式MM,继续上路,坐着冒着烟的飞机来到了剑桥,这里真是个美丽的地方,我用手机拍了很多的照片手机没电了,也玩的累了。找了个酒店 ,准备休息一下,然后给我的手机充充电。 才知道英国的插座都是下面这个样子:而我的…

    2022年2月27日
    45
  • 十、模板方法模式—制作更多好喝的饮品! #和设计模式一起旅行#

    无规矩不成方圆!故事背景在安装了酷炫了碉堡了的灯之后,我饿设计模式MM经营的奶茶店生意更加火爆,有不同国家的顾客,那么为了满足更多消费者的口味,我们推出了中国龙井苹果茶和叶门摩卡牛奶咖啡。其中制作的过程:把水烧开将咖啡/茶叶放到杯子里用沸水冲泡加入牛奶/苹果汁下面用代码来表示茶和咖啡的制作过程!//龙井苹果茶制作public class LongJi…

    2022年2月27日
    39
  • java工厂模式实例(设计模式)「建议收藏」

    java工厂模式实例(设计模式)「建议收藏」java工厂模式开篇声明,此理解为作者自身理解,不一定正确,如有错误请大佬们指正。工厂模式,在作者看来,从现实生活来说,就是一个工厂,里面有N个车间,每个车间会生产不同的产品,而租户只需要告诉这个工厂的老板我需要一个什么产品,老板会去找到对应的车间返回给租户使用。画个图理解:如果使用java语言来描述则是,对具有相同动作,不同动作执行过程的一类方法抽象出一个接口类,然后不同的实现类对接口类中的接口进行不同的实现,并且编写一个工厂类,根据传入获取不同的实现类实例返回给调用者

    2022年7月20日
    12
  • 【APP UI 设计模式】(一)APP UI 设计原则和流程

    【APP UI 设计模式】(一)APP UI 设计原则和流程

    2021年12月3日
    59
  • 设计模式之建造者模式

    设计模式之建造者模式

    2021年12月16日
    40

发表回复

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

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