首页 > 编程语言 > Java设计模式-抽象工厂模式

Java设计模式-抽象工厂模式

时间:2023-05-18 19:31:47浏览次数:32  
标签:Java 创建 文本框 工厂 抽象 模式 按钮 设计模式

简介

设计模式是软件设计中的一种常见方法,通过定义一系列通用的解决方案,来解决常见的软件设计问题。其中,抽象工厂模式是一种非常常见的设计模式,它可以帮助我们创建一组相关的对象,而不需要指定具体的实现方式。

抽象工厂模式是一种创建型设计模式,它提供了一种方式来创建一组相关的对象,而不需要暴露具体的实现方式。通过使用抽象工厂模式,我们可以把客户端与具体实现分离,从而提高代码的可维护性和可扩展性。

抽象工厂模式的主要用途是创建一组相关的对象。例如,在一个游戏中,我们需要创建一组不同种类的武器、防具和道具。这些对象可能有不同的实现方式,但是它们都属于同一组对象。通过使用抽象工厂模式,我们可以将它们的创建逻辑封装在一个工厂中,从而简化客户端代码。

在软件设计中,有很多与抽象工厂模式相似的设计模式,如工厂方法模式和建造者模式。这些模式也可以用来创建对象,但它们和抽象工厂模式之间存在一些区别。

  • 工厂方法模式

工厂方法模式和抽象工厂模式都可以用来创建对象,但是它们之间有一个重要的区别。在工厂方法模式中,我们只需要实现一个工厂方法,它负责创建一个特定类型的对象。而在抽象工厂模式中,我们需要实现一个工厂接口,它负责创建一组相关的对象。

  • 建造者模式

建造者模式是一种用于创建复杂对象的设计模式。它可以将一个复杂对象的构造逻辑拆分成多个简单的部分,并且允许客户端按照需要组装这些部分。与抽象工厂模式相比,建造者模式更加灵活,但是它也更加复杂。

实现

我们可以通过定义一个抽象工厂接口和多个具体工厂来实现抽象工厂模式。具体工厂实现工厂接口,并且负责创建一组相关的对象。

下面是一个使用抽象工厂模式创建按钮和文本框的示例。我们定义了一个抽象工厂接口GUIFactory,它包含了两个方法:createButton()createTextBox()。同时,我们也定义了两个具体工厂类WinFactoryMacFactory,它们都实现了GUIFactory接口,并且负责创建特定平台下的按钮和文本框,代码如下:

// 抽象工厂接口
interface GUIFactory {
    Button createButton();
    TextBox createTextBox();
}

// 具体工厂类 - Windows工厂
class WinFactory implements GUIFactory {
    public Button createButton() {
        return new WinButton();
    }

    public TextBox createTextBox() {
        return new WinTextBox();
    }
}

// 具体工厂类 - Mac工厂
class MacFactory implements GUIFactory {
    public Button createButton() {
        return new MacButton();
    }

    public TextBox createTextBox() {
        return new MacTextBox();
    }
}


我们还定义了两个按钮类ButtonWinButton,以及两个文本框类TextBoxWinTextBox。它们都是抽象类或接口,具体实现由具体工厂类来完成。

// 抽象按钮类
abstract class Button {
    public abstract void paint();
}

// 抽象文本框类
abstract class TextBox {
    public abstract void paint();
}

// Windows按钮类
class WinButton extends Button {
    public void paint() {
        System.out.println("Windows按钮");
    }
}

// Windows文本框类
class WinTextBox extends TextBox {
    public void paint() {
        System.out.println("Windows文本框");
    }
}

我们还定义了Mac按钮类MacButton和Mac文本框类MacTextBox,具体实现和Windows下的按钮和文本框类似,这里就不一一列举了。

// Mac按钮类
class MacButton extends Button {
    public void paint() {
        System.out.println("Mac按钮");
    }
}

// Mac文本框类
class MacTextBox extends TextBox {
    public void paint() {
        System.out.println("Mac文本框");
    }
}

使用抽象工厂模式,我们可以轻松地创建不同平台下的按钮和文本框,而不需要暴露具体的实现方式。例如,在Windows平台下,我们可以使用WinFactory来创建按钮和文本框:

GUIFactory factory = new WinFactory();
Button button = factory.createButton();
TextBox textBox = factory.createTextBox();
button.paint();
textBox.paint();

输出结果为:

Windows按钮
Windows文本框

而在Mac平台下,我们可以使用MacFactory来创建按钮和文本框:

GUIFactory factory = new MacFactory();
Button button = factory.createButton();
TextBox textBox = factory.createTextBox();
button.paint();
textBox.paint();

输出结果为:

Mac按钮
Mac文本框

优缺点

抽象工厂模式的主要优点是:

  • 可以封装一组相关对象的创建逻辑,从而提高代码的可维护性和可扩展性。
  • 可以帮助客户端代码与具体类的解耦,从而提高代码的灵活性和可移植性。
  • 可以通过工厂的切换来实现对不同平台或不同产品系列的支持,同时又不会对客户端代码造成影响。

抽象工厂模式的缺点是:

  • 在新增产品系列时,需要修改工厂接口及所有具体工厂类的实现,从而增加了代码的维护成本。
  • 当产品系列比较复杂时,抽象工厂模式可能会变得比较臃肿。

运用场景

抽象工厂模式通常在以下场景中被使用:

  • 系统需要支持多种产品系列,并且每个产品系列都有相应的抽象工厂、具体工厂和产品类。
  • 系统需要动态地切换产品系列,例如根据用户的操作系统或用户的选择来决定使用哪种产品系列。
  • 系统的产品族和产品等级结构稳定不变,但是仍然需要满足开闭原则,以便在将来新增产品时能够方便地扩展系统功能。

抽象工厂模式在GUI设计、数据库访问、游戏开发等领域得到了广泛的应用,可以说是一种非常实用的设计模式。

总结

抽象工厂模式是一种创建型设计模式,用于封装一组相关对象的创建逻辑,从而提高代码的可维护性、可扩展性和可移植性。该模式通过定义抽象工厂、具体工厂和抽象产品等级结构,将客户端代码与具体类的实现解耦,并且可以实现对不同平台或不同产品系列的支持。抽象工厂模式的主要优点是可以提高代码的灵活性、可维护性和可扩展性,而缺点则是需要修改工厂接口及所有具体工厂类的实现,增加了代码的维护成本。抽象工厂模式通常在需要支持多种产品系列、动态切换产品系列或稳定不变的产品族和产品等级结构的场景中被使用。

抽象工厂模式

标签:Java,创建,文本框,工厂,抽象,模式,按钮,设计模式
From: https://blog.51cto.com/u_10217684/6306764

相关文章

  • Java设计模式-外观模式
    简介在软件开发过程中,经常会遇到复杂的系统和庞大的类库。这些系统往往包含了大量的类和子系统,给开发人员带来了挑战。为了简化接口设计和提高系统的可用性,设计模式提供了一种名为外观模式的解决方案。外观模式是一种结构型设计模式,旨在为复杂系统提供一个简化的接口。该模式通......
  • Javascript 常见的循环方式总结
    本文地址:https://www.cnblogs.com/zichliang/p/17412968.html在Javascript中有很多种循环方式。有多种循环方式可以用来遍历数组、对象、以及执行一些重复性任务但是有很多方式甚至从未用过,所以简单来总结一下JS中的循环for循环for循环是在您希望创建循环时经常使用的工具。......
  • java8新特性,stream流简单使用
    //新建测试类@Data@NoArgsConstructor@AllArgsConstructor@EqualsAndHashCodepublicclassAuthor{//idprivateLongid;//姓名privateStringname;//年龄privateIntegerage;//简介privateStringintro;//作品privateList<Book>......
  • JavaScript全解析——Ajax是什么(上)
    AJAX是AsynchronousJavaScriptAndXML的缩写。它不是一种编程语言。它是一种基于HTML、CSS、JavaScript和XML,让开发更好、更快和更有互动的Web应用的技术。什么是ajax认识前后端交互前后端交互就是前端与后端的一种通讯方式,主要使用的技术栈就是ajax(asyncjavascript......
  • 通过java执行导出命令,导出dup数据文件到指定位置
    /***1.通过java执行导出命令,导出dup数据文件到指定位置*2.清空表数据,为下一次解析准备*/publicvoidexpDupDataByJaveProcess(){booleansuccess=true;//导致是否成功标识,成功修改为falseStringcmdSql="";//导出命令语句......
  • Java实现输出九九乘法表—for循环和递归算法
    Java实现输出99乘法表for循环publicclassninenine{publicstaticvoidmain(String[]args){for(inti=1;i<10;i++){for(intj=1;j<=i;j++){System.out.printf("%d*%d=%d\t",j,i,j*i);}......
  • 35基于java的校园二手交易系统或跳蚤市场设计与实现
    基于java的校园二手交易系统或跳蚤市场设计与实现,可适用于二手交易平台,二手商城,交易商城,大学生交易平台,购物平台,大学生跳蚤平台等等项目概述随着网络技术的发展,在线购物越来越流行。目前,大学生特别是毕业生的闲置物品很多,很多可以重复使用,但不方便携带。目前市场上针对大学生......
  • java内嵌数据库hsqldb
    java内嵌数据库hsqldb介绍:jdk1.8,maven k开发软件:ideaspringboot+mybatis+hsqldb内容:1.项目搭建2.基本操作3.本地数据持久化第一步 新建maven项目导入依赖<dependencies><dependency><groupId>org.hsql......
  • javascript创建数组
    javascript数组:vararray=[]等于创建一个数组array[0]代表给数组的第一个位置上赋值,值为32array[5]代表给数组的第六位置上赋值。值为3在位置0,1,2,5位置上都赋值,维度3,4位置上未赋值,但有一栏占位,所以会导致array.lenth获取数组的长度为6dor(vari=0;<array.lenth;i++){}代表的......
  • 实验三 Java类的继承与派生
    第1关类的继承packagestep1;importjava.util.Scanner;classPerson{/**********Begin**********///自行设计类的实现//姓名privateStringname;//性别privateStringsex;//年龄privateintage;//构造方法publi......