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

1、动机与定义

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

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

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

2、结构与类图

通用类图例如以下:

文字开头那个创建GUI的样例类图例如以下,此处仅仅创建了Button和TextArea:

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

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%使用某个环境,仅仅有模式的灵活变通,多模式混合才会产生优秀的设计。

设计模式学习03—抽象工厂模式,布布扣,bubuko.com

时间: 2024-10-02 18:32:29

设计模式学习03—抽象工厂模式的相关文章

设计模式学习-抽象工厂模式

1.定义 提供接口,创建一系列相关或独立的对象,而不指定这些对象的具体类. 2.类图 3.代码示例 1 package com.zhaoyangwoo.abstractfactory; 2 3 /** 4 * Created by john on 16/5/2. 5 * @author wuzhaoyang 6 * <p> 7 * 抽象工厂:多个抽象产品类,派生出多个具体产品类:一个抽象工厂类,派生出多个具体工厂类:每个具体工厂类可创建多个具体产品类的实例. 8 * 即提供一个创建一系列相关或

设计模式学习之抽象工厂模式

抽象工厂模式定义:Provide an interface for creating families of related or dependent objects without specifying their concrete classes. (为创建一组相关或互相依赖的对象提供一个接口,而且无需指定他们的具体类) 上一章学习了工厂模式,这两个模式有很大的相似的地方,但是使用的情景不一样,所以要采用不一样方式.对比下这两个模式: 工厂模式                       

Java设计模式学习记录-抽象工厂模式

前言 上篇博客介绍了简单工厂模式和工厂方法模式,这次介绍抽象工厂模式,抽象工厂模式和工厂方法模式的区别在于需要创建对象的复杂程度上. 抽象工厂模式 抽象工厂模式是围绕着一个超级工厂创建其他工厂.这个超级工厂被称为其他工厂的工厂,主要是为了解决接口选择问题. 举例说明: 还是继续上篇用户使用手的例子,现在生产手机的工厂发现,不同的手机使用的配件也不相同,需要单独的生产配件.例如iphonX使用的原深感摄像头,以及OLED显示屏,而iphone8使用的全新感光元件组成的摄像头,以及视网膜高清显示屏.

设计模式学习笔记--抽象工厂模式

1 using System; 2 3 namespace AbstractFactory 4 { 5 /// <summary> 6 /// 作者:bzyzhang 7 /// 时间:2016/5/28 10:23:20 8 /// 博客地址:http://www.cnblogs.com/bzyzhang/ 9 /// User说明:本代码版权归bzyzhang所有,使用时必须带上bzyzhang博客地址 10 /// </summary> 11 public class Use

设计模式学习(二)-简单工厂模式

---恢复内容开始--- 简单工厂设计模式 简单工厂模式定义: 简单工厂设计模式又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式.在简单工厂模式中,可以根据参数的不同返回不同类的实例.简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 简单工厂主要分为如下几个角色 抽象产品(abstract product):为所有具体产品的抽象表现,一般为抽象类 具体产品(product):为抽象产品的具体实现 生成产品工厂(facto

设计模式C++实现——抽象工厂模式

模式定义: 抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类. 抽象工厂允许客户使用抽象的接口来创建一组相关产品,而不需要知道实际产出的具体产品时什么.这样一来,客户就从具体的产品中被解耦了. 模式结构: 举例: 数据库访问程序设计,不同的数据库访问方式可能不一样,为了抽象对对不同数据库的访问,可以将数据库隐藏起来,提供统一的访问方式,用多态进行实现. UML设计: 编程实现及执行结果: #include <iostream> using namespace st

一天一个设计模式——Abstract Factory抽象工厂模式

一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂方法模式中,抽象工厂使用抽象的零件组装成抽象的产品.即使用包含特定的方法接口零件,将零件组装成抽象产品. 二.模式类图: 上面的类图中包含两个包:包含抽象工厂,抽象零件,抽象产品的类所在的包以及具体工厂实现类的包. 三.代码示例 1.Item类: package com.designpattern.

大话设计模式C++版——抽象工厂模式

前面说过,简单工厂模式是最基础的一种设计模式,那以工厂命名的设计模式就是23种设计模式中最多的一种,他们一脉相承,一步一步进化而来,这里就是其中的最后一种--抽象工厂模式(Abstract Factory),其是在工厂方法模式的基础上改进而来,如果没有弄明白工厂方法模式的同学请先观看<大话设计模式C++版--工厂方法模式>. 为什么会有抽象工厂模式?抽象工厂模式是简单工厂模式缺陷的终极解决方式么?NO,抽象工厂模式并不是为了解决简单工厂模式的缺陷而活着,它是因为有新的使命而诞生. 一个简单的例

[Python编程实战] 第一章 python的创建型设计模式1.1抽象工厂模式

注:关乎对象的创建方式的设计模式就是"创建型设计模式"(creational design pattern) 1.1 抽象工厂模式 "抽象工厂模式"(Abstract Factory Pattern)用来创建复杂的对象,这种对象由许多小对象组成,而这些小对象都属于某个特定的"系列"(family). 比如说,在GUI 系统里可以设计"抽象控件工厂"(abstract widget factory),并设计三个"具体子