设计模式(java)- 工厂模式

2024-06-22 16:48

本文主要是介绍设计模式(java)- 工厂模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

工厂模式

工厂模式,顾名思义,属于创建型模式,在一个项目中也是经常被使用的一种模式。工厂模式分为简单工厂、工厂方法、抽象工厂三种模式。工厂模式可以使客户通过简单的调用方法来获取相关联或者继承同一父类的子类对象,方便了程序的扩展性,将客户代码与对象的创建进行解耦,客户代码不必关系对象创建的逻辑就可以直接获取自己想要的对象。

简单工厂模式

简单工厂模式体现在简单二字,即一个工厂类就可以构造出客户所需要的对象,通过根据客户传入的条件实参来构建相对应的子类对象。代码如下:

interface IMessage {public void sendMsg();
}class RequsetMessage implements IMessage {public void sendMsg() {System.out.println("this is request message!");}
}class ResponseMessage implements IMessage {public void sendMsg() {System.out.println("this is reponse message!");}
}// Simple factory
class MessageFactory {public static IMessage getMessage(int nMessageType) {IMessage message = null;switch (nMessageType) {case 0:message = new RequsetMessage();break;case 1:message = new ResponseMessage();break;default:break;}return message;}
}

简单工厂模式在子类过多时,条件语句也会随之变多,这个时候我们可以使用表驱动的方式进行对象的构建。

工厂方法

我们在简单工厂中发现,客户代码虽然不去关注构建对象的逻辑,但是需要关注类的标识符(工厂类中静态方法的形参),同时我们需要增加一个类的时候,需要新增case,这种情况是破环了设计上的开闭原则(一般情况下可以舍弃这个原则)。所以工厂方法便解决了上面所说的。工厂方法是将一个工厂变成多个工厂,每个工厂之负责自己的类对象的构建,保持单一职责,且新增一个子类的时候,我们只需要新增一个工厂类即可。

// Factory method
interface IMessageFactory {public IMessage createMessage();
}class RequestMessageFactory implements IMessageFactory {public IMessage createMessage() {return new RequsetMessage();}
}class ResponseMessageFactory implements IMessageFactory {public IMessage createMessage() {return new ResponseMessage();}
}

如上,工厂方法就是将工厂抽象话,然后让各个工厂各司其职,对自己负责的类进行构建,当对象的初始化需要过多的逻辑、复杂程度过高时,工厂方法的优势就有所体现。当构建一个子类对象只需要一条简单的new语句的话,一般建议使用简单工厂就可以了。

抽象工厂

抽象工厂是工厂方法的特殊模式,它的使用一般适用于产品族的概念,它适用于的一般情况是:继承不同父类的子类,但是这些子类又同属于一个管理池或者产品池中。可见它的使用一般适合业务相关的。

举个例子,一家文具公司有两个产品线:分别是星辰和青春系列的文具,那么文具中都有铅笔和橡皮,两者属于不同的产品风格,但是星辰铅笔和青春铅笔又继承同一个接口铅笔,同理橡皮也是,那么在这种业务情况下我们将同一产品下的文具归属到同一个工厂中是合理的,这种抽象到具体业务的工厂更加适合在当前业务中对该产品线的统一管理,从而保证了上层客户对产品线的切换,方便了客户代码的重用。

// Abstract factory
interface IPencil {public void write();
}interface IRubber {public void erase();
}class StarPencil implements IPencil {public void write() {System.out.println("This is the pencil of the Star product line.");}
}class StarRubber implements IRubber {public void erase() {System.out.println("This is the rubber of the Star product line.");}
}class YouthPencil implements IPencil {public void write() {System.out.println("This is the pencil of the Youth product line.");}
}class YouthRubber implements IRubber {public void erase() {System.out.println("This is the rubber of the Youth product line.");}
}interface IStationeryFactory {public IPencil createPencil();public IRubber createRubber();
}class StarStationeryFactory implements IStationeryFactory {public IPencil createPencil() {return new StarPencil();}public IRubber createRubber() {return new StarRubber();}
}class YouthStationeryFactory implements IStationeryFactory {public IPencil createPencil() {return new YouthPencil();}public IRubber createRubber() {return new YouthRubber();}
}

如上,我们将统一产品线的文具放到一个工厂中,提供不同的获取方法,方便客户代码获取不同产品线下的文具对象。

客户代码

以下是客户代码,分别对三种工厂模式的使用:

	public static void main(String[] args) {// TODO Auto-generated method stubIMessage sampleMessage = MessageFactory.getMessage(0);sampleMessage.sendMsg();IMessageFactory messageFactory = new ResponseMessageFactory();IMessage methodMessage = messageFactory.createMessage();methodMessage.sendMsg();IStationeryFactory stationeryFactory = new StarStationeryFactory();IPencil abstractPencil = stationeryFactory.createPencil();abstractPencil.write();IRubber abstractRubber = stationeryFactory.createRubber();abstractRubber.erase();}

说明

对于一些简单或者经常使用的入门级设计模式,这里就不去花费太多的时间贴出UML设计类图了,必要时,再后续的设计模式总结种会有类图来加强理解。

当然,设计模式本质上学起了不难,主要是如何将其体现在项目种,发挥出其作用才是其关键,有时单独列出一些简单的实例是看不出来它的作用,但是结合项目的上下文,变通的将其融入到项目中,对我们的代码、架构设计能力都是有很大的帮助的。

这篇关于设计模式(java)- 工厂模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1084851

相关文章

Java五子棋之坐标校正

上篇针对了Java项目中的解构思维,在这篇内容中我们不妨从整体项目中拆解拿出一个非常重要的五子棋逻辑实现:坐标校正,我们如何使漫无目的鼠标点击变得有序化和可控化呢? 目录 一、从鼠标监听到获取坐标 1.MouseListener和MouseAdapter 2.mousePressed方法 二、坐标校正的具体实现方法 1.关于fillOval方法 2.坐标获取 3.坐标转换 4.坐

Spring Cloud:构建分布式系统的利器

引言 在当今的云计算和微服务架构时代,构建高效、可靠的分布式系统成为软件开发的重要任务。Spring Cloud 提供了一套完整的解决方案,帮助开发者快速构建分布式系统中的一些常见模式(例如配置管理、服务发现、断路器等)。本文将探讨 Spring Cloud 的定义、核心组件、应用场景以及未来的发展趋势。 什么是 Spring Cloud Spring Cloud 是一个基于 Spring

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

java8的新特性之一(Java Lambda表达式)

1:Java8的新特性 Lambda 表达式: 允许以更简洁的方式表示匿名函数(或称为闭包)。可以将Lambda表达式作为参数传递给方法或赋值给函数式接口类型的变量。 Stream API: 提供了一种处理集合数据的流式处理方式,支持函数式编程风格。 允许以声明性方式处理数据集合(如List、Set等)。提供了一系列操作,如map、filter、reduce等,以支持复杂的查询和转

如何开启和关闭3GB模式

https://jingyan.baidu.com/article/4d58d5414dfc2f9dd4e9c082.html

Java面试八股之怎么通过Java程序判断JVM是32位还是64位

怎么通过Java程序判断JVM是32位还是64位 可以通过Java程序内部检查系统属性来判断当前运行的JVM是32位还是64位。以下是一个简单的方法: public class JvmBitCheck {public static void main(String[] args) {String arch = System.getProperty("os.arch");String dataM

详细分析Springmvc中的@ModelAttribute基本知识(附Demo)

目录 前言1. 注解用法1.1 方法参数1.2 方法1.3 类 2. 注解场景2.1 表单参数2.2 AJAX请求2.3 文件上传 3. 实战4. 总结 前言 将请求参数绑定到模型对象上,或者在请求处理之前添加模型属性 可以在方法参数、方法或者类上使用 一般适用这几种场景: 表单处理:通过 @ModelAttribute 将表单数据绑定到模型对象上预处理逻辑:在请求处理之前

eclipse运行springboot项目,找不到主类

解决办法尝试了很多种,下载sts压缩包行不通。最后解决办法如图: help--->Eclipse Marketplace--->Popular--->找到Spring Tools 3---->Installed。

JAVA读取MongoDB中的二进制图片并显示在页面上

1:Jsp页面: <td><img src="${ctx}/mongoImg/show"></td> 2:xml配置: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001

Java面试题:通过实例说明内连接、左外连接和右外连接的区别

在 SQL 中,连接(JOIN)用于在多个表之间组合行。最常用的连接类型是内连接(INNER JOIN)、左外连接(LEFT OUTER JOIN)和右外连接(RIGHT OUTER JOIN)。它们的主要区别在于它们如何处理表之间的匹配和不匹配行。下面是每种连接的详细说明和示例。 表示例 假设有两个表:Customers 和 Orders。 Customers CustomerIDCus