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

java设计模式【抽象工厂模式】

时间:2023-05-17 14:45:20浏览次数:48  
标签:java printInfo 模式 工厂 抽象 产品 设计模式 public

java设计模式【抽象工厂模式】

抽象工厂模式

抽象工厂模式是对简单工厂模式的一个变种,它允许通过一个统一的接口来创建不同的产品实例,而无需指定具体的子类。在这个模式中,我们只关心产品的抽象接口,而将具体的产品实现留给子类去实现。这样,我们可以通过创建不同的工厂对象来创建不同的产品实例,而无需关心它们实际实现的是哪个具体产品。

抽象工厂模式的实现分为以下几个步骤:

  1. 定义抽象产品接口:抽象工厂模式的核心是抽象产品接口,它定义了产品的基本结构和行为。
  2. 定义具体工厂接口:具体工厂接口是实现抽象产品接口的工厂类,它们负责创建具体产品实例。
  3. 定义工厂:每个具体工厂都是一个特定领域的工厂,它实现了抽象工厂接口,并提供了具体的产品实现。
  4. 创建产品实例:使用抽象工厂接口,客户端可以创建不同的产品实例,而无需指定具体的子类。

优缺点

优点:

  1. 具体产品在应用层的代码隔离,无需关系创建的细节。
  2. 将一个系列的产品统一到一起创建,方便产品族的扩展。
  3. 提供一个产品类的库,所有的产品以同样的接口出现,使得客户端不依赖于具体实现。
  4. 通过创建不同的工厂对象来创建不同的产品实例,无需关心它们实际实现的是哪个具体产品。

缺点:

  1. 规定了所有可能被创建的产品集合,产品族中扩展新的产品困难。
  2. 增加了系统的抽象性和理解难度。
  3. 使用场景:客户端(应用层)不依赖与产品类的实现等细节。
  4. 需要大量的重复代码,增加了开发和维护的成本。

使用场景

  1. 一个系统要独立于它的产品的创建、组合和表示时。
  2. 一个系统要由多个产品系列中的一个来配置时。
  3. 需要强调一系列相关的产品对象的设计以便进行联合使用时。
  4. 提供一个产品类库,而只想显示它们的接口而不是实现时。
  5. 产品之间相互关联、相互依赖且相互约束的地方。

具体实现

以下以智能产品汽车和手机为例,继承关系如下:

image

定义抽象工厂

/**
 * 智能产品抽象工厂
 */
public interface SmartProductFactory {

    ISmartPhone createSmartPhone();

    ISmartCar createSmartCar();

}

具体工厂

/**
 * @author physicx
 * @date 2023/5/17 上午11:18
 * @desc 华为工厂
 * Created with IntelliJ IDEA
 */
public class HuaweiFactory implements SmartProductFactory {
    @Override
    public ISmartPhone createSmartPhone() {
        return new HuaweiSmartPhone();
    }

    @Override
    public ISmartCar createSmartCar() {
        return new HuaweiSmartCar();
    }
}
/**
 * @author guogq
 * @date 2023/5/17 上午11:18
 * @desc 小米工厂
 * Created with IntelliJ IDEA
 */
public class XiaomiFactory implements SmartProductFactory {
    @Override
    public ISmartPhone createSmartPhone() {
        return new XiaomiSmartPhone();
    }

    @Override
    public ISmartCar createSmartCar() {
        return new XiaomiSmartCar();
    }
}

定义抽象产品

/**
 * 智能手机
 */
public interface ISmartPhone {

    void printInfo();

}
/**
 * 智能汽车
 */
public interface ISmartCar {
    void printInfo();
}

具体产品

/**
 * @author physicx
 * @date 2023/5/17 上午11:19
 * @desc 华为智能汽车
 * Created with IntelliJ IDEA
 */
public class HuaweiSmartCar implements ISmartCar {
    @Override
    public void printInfo() {
        System.out.println("华为智能汽车");
    }
}
/**
 * @author guogq
 * @date 2023/5/17 上午11:19
 * @desc 华为智能手机
 * Created with IntelliJ IDEA
 */
public class HuaweiSmartPhone implements ISmartPhone {
    @Override
    public void printInfo() {
        System.out.println("华为智能手机");
    }
}
/**
 * @author guogq
 * @date 2023/5/17 上午11:19
 * @desc 小米智能汽车
 * Created with IntelliJ IDEA
 */
public class XiaomiSmartCar implements ISmartCar {
    @Override
    public void printInfo() {
        System.out.println("小米智能汽车");
    }
}
/**
 * @author guogq
 * @date 2023/5/17 上午11:19
 * @desc 小米智能手机
 * Created with IntelliJ IDEA
 */
public class XiaomiSmartPhone implements ISmartPhone {
    @Override
    public void printInfo() {
        System.out.println("小米智能手机");
    }
}

客户端调用

public static void main(String[] args) {
        HuaweiFactory huaweiFactory = new HuaweiFactory();
        huaweiFactory.createSmartPhone().printInfo();
        huaweiFactory.createSmartCar().printInfo();

        XiaomiFactory xiaomiFactory = new XiaomiFactory();
        xiaomiFactory.createSmartPhone().printInfo();
        xiaomiFactory.createSmartCar().printInfo();
    }

打印如下:

image

工厂方法模式和抽象工厂模式区别

工厂方法模式和抽象工厂模式都是创建型模式,区别如下:

  1. 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
  2. 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
  3. 工厂方法模式的使用很简单,只要继承成子类,并实现工厂方法的工厂就可以了,而抽象工厂模式需要先实例化它,然后将它传入一些针对抽象类型所写的代码中。
  4. 工厂方法模式的优点是可以把一群相关的产品集合起来,而抽象工厂模式的优点是可以把一群相关的产品集合起来,并且创建整个产品家族的模式。

总之,工厂方法是由子类自行决定实例化那个类,而抽象工厂是自己决定实例化哪个类。至于是组合还是继承还是实现接口都无所谓。根本区别在于是自己实例化还是子类实例化。

如果产品单一,只有一个产品等级结构适合使用工厂方法模式。如果存在多个产品等级,产品分类多个可以形成产品族合适使用抽象工厂模式。

补充说明

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

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

标签:java,printInfo,模式,工厂,抽象,产品,设计模式,public
From: https://www.cnblogs.com/physicx/p/17408680.html

相关文章

  • Javascript执行原理 网页引入javascript的三种方式* javascript核心语法 数据类型 Typ
    Javascript执行原理:用户端发送请求到服务器端将js解析出来的数据(用户身份表示)绑定在请求路径中服务器端获取到参数后会响应客户端客户端通过浏览器解析响应的数据并将数据展现在浏览器上网页引入javascript的三种方式*:使用script标签<scripttype=“text/javascript”>aler......
  • Java学习计划
    复习计划及学习网站的时间表如下所示:日期科目学习网站1月1日基本语法和变量类型CodecademyJava课程1月4日运算符和控制语句CourseraJava程序设计1月7日数组、集合和泛型UdemyJava基础课程1月10日类与对象PluralsightJava课程1月13日继承、抽象类......
  • java设计模式【工厂方法模式】
    java设计模式【工厂方法模式】工厂方法模式工厂方法模式(FACTORYMETHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具......
  • .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......