顶部左侧内容
百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 在线教程 > 正文

设计模式使用场景实现示例及优缺点(创建型模式—抽象工厂模式)

gosiye 2024-08-22 12:58 6 浏览 0 评论


抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式通过对产品类的工厂进行抽象,使得一个工厂可以生产多种类型的产品。

适用场景

  1. 系统需要独立于产品创建的方式时
  2. 客户端代码不需要知道具体产品的创建过程,只需要知道如何使用抽象接口。
  3. 系统有多个产品系列,每个系列有多种类型的产品时
  4. 例如,GUI库可能提供不同风格的窗口和按钮(如Windows风格和Mac风格),抽象工厂可以提供一个接口来创建不同风格的组件。
  5. 需要保证产品系列的一致性时
  6. 抽象工厂模式确保同一个工厂创建的产品系列是兼容的。

实现示例(Java)

以下是一个简单的抽象工厂模式的实现示例,展示如何创建不同风格的GUI组件(如按钮和复选框)。

1. 定义抽象产品接口

// 抽象产品A
public interface Button {
    void paint();
}

// 抽象产品B
public interface Checkbox {
    void paint();
}

2. 具体产品类实现抽象产品接口

// 具体产品A1
public class WindowsButton implements Button {
    @Override
    public void paint() {
        System.out.println("Windows Button");
    }
}

// 具体产品A2
public class MacButton implements Button {
    @Override
    public void paint() {
        System.out.println("Mac Button");
    }
}

// 具体产品B1
public class WindowsCheckbox implements Checkbox {
    @Override
    public void paint() {
        System.out.println("Windows Checkbox");
    }
}

// 具体产品B2
public class MacCheckbox implements Checkbox {
    @Override
    public void paint() {
        System.out.println("Mac Checkbox");
    }
}

3. 定义抽象工厂接口

public interface GUIFactory {
    Button createButton();
    Checkbox createCheckbox();
}

4. 具体工厂类实现抽象工厂接口

// 具体工厂1
public class WindowsFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new WindowsButton();
    }

    @Override
    public Checkbox createCheckbox() {
        return new WindowsCheckbox();
    }
}

// 具体工厂2
public class MacFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new MacButton();
    }

    @Override
    public Checkbox createCheckbox() {
        return new MacCheckbox();
    }
}

5. 客户端代码

public class Application {
    private Button button;
    private Checkbox checkbox;

    // 构造函数接收抽象工厂类型
    public Application(GUIFactory factory) {
        button = factory.createButton();
        checkbox = factory.createCheckbox();
    }

    // 模拟绘制方法
    public void paint() {
        button.paint();
        checkbox.paint();
    }

    public static void main(String[] args) {
        // 可根据需求选择具体工厂
        GUIFactory factory = new WindowsFactory();
        Application app = new Application(factory);
        app.paint();

        factory = new MacFactory();
        app = new Application(factory);
        app.paint();
    }
}

注释说明

  1. 抽象产品接口
  2. ButtonCheckbox 是两个抽象产品接口,定义了产品的通用行为(如 paint 方法)。
  3. 具体产品类
  4. WindowsButtonMacButtonWindowsCheckboxMacCheckbox 是具体产品类,它们实现了抽象产品接口,提供具体的产品行为。
  5. 抽象工厂接口
  6. GUIFactory 是抽象工厂接口,定义了创建一系列相关产品的方法(如 createButtoncreateCheckbox)。
  7. 具体工厂类
  8. WindowsFactoryMacFactory 是具体工厂类,它们实现了抽象工厂接口,提供了具体的产品创建方法。
  9. 客户端代码
  10. Application 类通过依赖抽象工厂接口来创建产品。这样,客户端代码与具体产品类解耦,便于扩展和维护。

总结

抽象工厂模式通过对产品类和工厂类的抽象,使得客户端代码可以独立于具体产品类和工厂类进行工作。它适用于需要创建一系列相关或相互依赖对象的系统,有助于提高代码的灵活性和一致性。

相关推荐

全球最大的H5网站模板库(h5页面模板下载)

当今社会,互联网迅猛发展,在网络营销中,客户往往通过企业的网站建设留下对该企业的第一印象,一个优秀的企业网站已成为企业发展的重要纽带,嗨创H5,拥有国内外一流的技术团队,潜心专研网站建设6年,是全球最...

wordpress集团公司网站模板:XSgr(wordpress建站公司)

小兽wordpress推出一款高端集团公司主题,打造高品质官网。高端是一种态度和坚持,因为我坚信贴合产品及品牌理念的高端深度定制才能最大化地呈现企业的务实严谨与产品的专业品质相比,某种程度上讲–...

私心推荐,小编酷爱的五款高逼格网站模板

建站宝盒的网站模板上千套之多,各有各的风格色彩,但是,弱水三千,小编我却只取一瓢饮,在这上千套模板之中,小编酷爱的网站模板有五套,让小编私心推荐一下吧!1、茶叶贸易公司网站模板小编对这款网站模板可是一...

「书讯」政府网站用户行为研究与应用

《政府网站用户行为研究与应用》作者:刘合翔著出版日期:2018年6月开本:16开出版社:经济管理出版社小编推荐《政府网站用户行为研究与应用》的主题是关于政府网站用户行为的特征规律及其在政府网站优...

免费服务器-搭建模板网站的操作流程(图文版)

之前发文《创业者的官网:如何搭建免费云服务器及操作面板(图文版)》,因为做了视频才发现,创业者对视频的需求,远远低于对图文解说的需求。因此,补充图文教程,不清楚的看官们,可以直接看视频版本进行细部学...

快收藏这些高逼格H5网站模板吧,不绕弯子直接下载

上面这些响应式H5网站是不是很炫酷,比起那些“在线一键生成”是不是好太多了?关键是,那些一键制作都不会开放源码给你,自定义性也很局限。不过说到底还是难看。今天笔者推荐大家一个模板网站,全都是高质量的响...

如何开发网站建设管理系统模板(如何开发网站建设管理系统模板图片)

根据用户网站需求文档设计美工图,并设计数据库结构,让网站开发人员可以更多地关注前台美工,先对照美工图,编写静态HTML页面,按网站建设管理系统模板语法,修改编写好的静态HTML页面,运行。不再需要对...

C语言的数据类型介绍(c语言的数据类型介绍是什么)

在计算机系统中,数据是放在内存中的,数字、文字、符号、图形、音频、视频等数据都是以二进制形式存储在内存中的,它们并没有本质上的区别,那么0001000该理解为数字8呢,还是图像中某个像素的颜色...

C 语言格式化输出函数中常用的格式符号

在之前介绍输入输出函数的文章中,有提到格式化输入输出函数都有包含一种特殊的符号——格式符号。那篇文章中关于格式符号也只是一笔带过,没有进行深入挖掘。本篇文章主要对输出函数(printf)中的一些常用格...

C#中的类型转换(c#数据转换类)

计算机存储的基本单位:字节我们知道一个字节(Byte)有8个比特(bit)构成,比特是存储的最小单位,表示0和1,但为什么计算机存储的基本单位是字节,而不是比特呢?假设我们要存储数字3(二进制:11...

Java8中String内存空间占用分析(电脑里下载的文件怎样删除才不会占用内存空间)

1.前言分析之前,简单回顾一下对象的内存分布。在HotSpot虚拟机中,对象在堆内存中的存储布局可以划分为三部分:对象头、实例数据和对齐填充。对象头包含两部分内容:MarkWord和类型指针。实例数据...

「每日C语言」数据类型大小和取值范围

对于c语言来说,数据类型是一个很重要的概念和知识点,它涉及到的是内存的空间,这在和硬件交互的时候是非常重要的。K&R给出了7个数据类型相关的关键字,分别是:int、long、short、uns...

【c语言学习笔记】数据类型(c语言里面的数据类型)

c语言学习笔记,欢迎大家能在评论区提出我学习错误的地方方便我进行改正~在计算机中,计算机用二进制来储存数据,在c语言中有许多的数据类型用来存储数据,当然不同的数据类型所用的内存占用也不一样,下面就来用...

关于MySQL varchar类型最大值,原来一直都理解错了

我是架构精进之路,点击上方“关注”,坚持每天为你分享技术干货,私信我回复“01”,送你一份程序员成长进阶大礼包。写在前面关于MySQLvarchar字段类型的最大值计算,也许我们一直都理解错误了,...

C语言数据类型的转换(c语言数据类型的转换方式)

类型转换在C语言程序中,经常需要对不同类型的数据进行运算,为了解决数据类型不一致的问题,需要对数据的类型进行转换。例如一个浮点数和一个整数相加,必须先将两个数转换成同一类型。C语言程序中的类型...

取消回复欢迎 发表评论: