首页 > 编程语言 >java设计模式【工厂方法模式】

java设计模式【工厂方法模式】

时间:2023-05-17 14:35:06浏览次数:42  
标签:java 工厂 具体 产品 抽象 设计模式 方法 public

java设计模式【工厂方法模式】

工厂方法模式

工厂方法模式FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品。

抽象工厂角色负责定义产品的创建接口,即产品的创建过程应当被推迟到子类中实现。具体工厂角色则实现这些创建接口,并负责实际创建产品的工作。抽象产品角色是工厂方法模式的核心,它定义了一个产品的接口,但并不实现具体的产品逻辑。具体产品角色则实现这些接口并负责具体的产品逻辑。

使用工厂方法模式可以在不修改具体工厂角色的情况下引入新的产品,从而简化了系统的设计,并提高了系统的可扩展性。

优缺点

优点

  1. 系统的可扩展性非常好。因为在添加新产品时,只需要添加新的具体工厂和具体产品,而不需要修改现有系统的代码。这样就保证了系统的可扩展性。

  2. 易于维护和管理。由于工厂方法模式将创建产品的逻辑推迟到子类中实现,因此可以更容易地进行维护和管理。子类可以在不改变父类接口的情况下添加新的特性,从而减少了系统的开销。

  3. 提高了系统的可靠性。因为在添加新产品时,只需要修改具体工厂类,而不需要修改客户端代码。这样可以减少因客户端代码变化而导致的系统崩溃的可能性。

缺点:

  1. 增加了系统的复杂度。在实现工厂方法模式时,需要引入抽象层,这样就增加了系统的抽象性和理解难度,同时也增加了实现的难度。

  2. 需要更多的代码编写。使用工厂方法模式需要编写新的具体工厂类和具体产品类,这样就会增加代码的复杂度和维护的难度。

使用场景

  1. 产品具有复杂的结构和层次关系,需要在多个子类之间共享某些共性逻辑。使用工厂方法模式可以将这些共性逻辑提取出来,作为一个独立的类进行封装,从而简化代码并提高系统的可扩展性。

  2. 系统需要提供一些通用的功能,但是这些功能可能会在不同的产品中被重复使用。使用工厂方法模式可以将这些通用功能提取出来,作为一个独立的类进行封装,从而降低系统的开发成本。

  3. 系统中需要使用组件化的设计思想,将不同的组件封装成独立的类。使用工厂方法模式可以将这些组件的创建过程推迟到子类中实现,从而简化代码并提高系统的可维护性。

  4. 系统需要支持动态添加和删除产品。使用工厂方法模式可以在不修改客户端代码的情况下动态添加和删除产品,从而提高系统的灵活性和可扩展性。

具体实现

以下以产品A,产品B为例实现工厂方法模式。

抽象工厂

抽象工厂定义产品的创建接口返回抽象产品

/**
 * 抽象工厂类
 */
public interface IFactory {

    /**
     * 定义创建产品接口
     *
     * @return 抽象产品
     */
    IProduct getInstance();

}

具体工厂

具体工厂继承实现工厂实现创建产品接口返回具体的产品

产品A工厂类

/**
 * @author physicx
 * @date 2023/5/15 上午10:12
 * @desc 产品A具体工厂类
 * Created with IntelliJ IDEA
 */
public class ProductAFactory implements IFactory {

    /**
     * 返回具体产品
     *
     * @return 产品A
     */
    @Override
    public IProduct getInstance() {
        return new ProductA();
    }
}

产品B工厂类

/**
 * @author physicx
 * @date 2023/5/15 上午10:18
 * @desc 产品B具体工厂
 * Created with IntelliJ IDEA
 */
public class ProductBFactory implements IFactory {

    /**
     * 返回具体产品
     *
     * @return 产品B
     */
    @Override
    public IProduct getInstance() {
        return new ProductB();
    }
}

抽象产品

抽象产品接口定义产品的默认方法和各产品实现有差异的方法

/**
 * 抽象产品类
 */
public interface IProduct {

    /**
     * 产品公共方法
     */
    default void publicMethod() {
        System.out.println("公共方法");
    }

    /**
     * 各个产品有差异方法,子类具体实现
     */
    void printInfo();

}

具体产品

具体产品实现抽象产品,各个产品对方法做自己的具体实现

产品A

/**
 * @author physicx
 * @date 2023/5/15 上午10:13
 * @desc 产品A
 * Created with IntelliJ IDEA
 */
public class ProductA implements IProduct {

    private final static String NAME = "产品A";

    /**
     * 输出产品信息
     */
    @Override
    public void printInfo() {
        System.out.println("产品名称:" + NAME);
    }
}

产品B

/**
 * @author physicx
 * @date 2023/5/15 上午10:17
 * @desc 产品B
 * Created with IntelliJ IDEA
 */
public class ProductB implements IProduct {

    private final static String NAME = "产品B";

    /**
     * 输出产品信息
     */
    @Override
    public void printInfo() {
        System.out.println("产品名称:" + NAME);
    }
}

调用示例

public static void main(String[] args) {
        //产品A工厂方法调用
        IProduct productA = new ProductAFactory().getInstance();
        productA.printInfo();
        //产品工厂方法调用
        IProduct productB = new ProductBFactory().getInstance();
        productB.printInfo();
    }

运行结果如下:

运行结果

补充说明

后续会依次更新 详解java 23种设计模式,欢迎关注、交流、补充相关内容(如下)。

快捷导航
设计模式简介总结
单例模式详解
工厂方法模式
抽象工厂模式

标签:java,工厂,具体,产品,抽象,设计模式,方法,public
From: https://www.cnblogs.com/physicx/p/17408635.html

相关文章

  • .Net Grpc Client调用Java Grpc Server
    1.JavaGrpcServer参考地址:grpc-javaos-maven-pluginprotobuf-maven-plugin1.新建SpringBoot项目[略]2.POM引入相关依赖<dependencies><dependency><groupId>io.github.lognet</groupId><artifactId>grpc......
  • Java中十个常见的违规编码
    摘要:作者VeeraSundar在清理代码工作时发现一些常见的违规编码,因此,VeeraSundar把针对常见的一些违规编码总结成一份列表,以便帮助Java爱好者提高代码的质量和可维护性。最近,我给Java项目做了一次代码清理工作。经过清理后,我发现一组常见的违规代码(指不规范的代码并不表示代码错......
  • 高吞吐高并发Java NIO服务的架构(NIO架构及应用之一)
    JavaNIO成功的应用在了各种分布式、即时通信和中间件Java系统中。证明了基于NIO构建的通信基础,是一种高效,且扩展性很强的通信架构。基于Reactor模式的高可扩展性架构这个架构的基本思路在“基于高可用性NIO服务器架构”(http://today.java.net/pub/a/today/2007/02/13/architectur......
  • 浅谈Javascript 中几种克隆(clone)方式
    一:在Javascript里,如果克隆对象是基本类型,我们直接赋值就可以了:Js代码varsStr="kingwell";varcStr=sStr;alert(cStr);//输出kingwellsStr="abc";alert(cStr);//输出kingwell; 把一个值赋给另一个变量时,当那个变量的值改变的时候,另一个值不会受到影响。 ......
  • Java 发展历史
     1995年5月23日,Java语言诞生1996年1月,第一个JDK-JDK1.0诞生1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入JAVA技术1996年9月,约8.3万个网页应用了JAVA技术来制作1997年2月18日,JDK1.1发布1997年4月2日,JavaOne会议召开,参与......
  • Java 主要特性
     Java语言是简单的:Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用。另一方面,Java丢弃了C++中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java语言不使用指针,而是引用。并提供了自动分配......
  • JavaScript——数字超过精度导致数据有误
    前言接口返回的number类型的数据,超过了JavaScript中Number类型的限制,浏览器自动进行了转换;console.log(7232167009634730040)内容以下内容来自ClaudeJavaScript的Number类型可以安全表示的最大整数是2^53-1,也就是9007199254740991。大于这个值的整数在JavaScript......
  • Java Jackson框架使用小技巧
    Jackson框架:  Jackson是一个简单的、功能强大的、基于Java的应用库。它可以很方便完成Java对象和Json对象(xml文档or其它格式)进行互转。Jackson社区相对比较活跃,更新速度也比较快。  Jackson库有如下几大特性:  -高性能且稳定:低内存占用,对大/小JSON串,大/小对象的解析表现均......
  • JAVA实现html代码转为图片
    方法一:html2Image1、引入依赖<dependency><groupId>gui.ava</groupId><artifactId>html2image</artifactId><version>2.0.1</version></dependency>2、代码实现@ComponentpublicclassHtmlUtil{/***......
  • ★常用设计模式
    创建型模式简单工厂选择不一样的参数,生成不一样的产品可用switch()来做参数选择publicclassFoodFactory{publicstaticFoodmakeFood(Stringname){if(name.equals("noodle")){Foodnoodle=newLanZhouNoodle();noodle.addSpicy("more");returnnoodle;}elseif......