java23种常用设计模式之工厂方法模式(Factory Method)

23种设计模式-工厂方法(Factory Method)设计模式 软考中级-软件设计师 工厂方法模式 阅读详情

最近真是所有时间都奉献给工作了,包括下班后,连续加了两个星期的班,都没时间写博客……

(借口!!!中午两个小时够写一篇啦!!!哈哈,我错了,是懒……)

23个设计模式才写了3个,我只想说一声,“”革命尚未成功,同志仍需努力呀!"

好了,胡扯到此结束,回到正题。今天我们来捋一捋工厂方法模式。这个模式很容易理解,如其名,无非就是为了偷懒,对某种事物进行工厂式的批量生产。

工厂方法有三种模式:普通工厂方法模式、多个工厂生产模式和静态工厂方法模式。

下面我们一一来揭开它的真面目。

一、普通工厂方法模式

建立一个工厂类,对实现了同一接口的一些类进行实例的创建,举个例子,发送消息,可以使邮件发送也可以是sms发送,我管他是什么消息,给工厂方法一个类型,我要什么就给我生产什么就好了,看类图:

首先,创建邮件和sms的共同接口

Sender.java

package com.freedom.factory;

public interface Sender {
	
	public void send();

}
然后,创建邮件发送消息的实现类

MailSender.java

package com.freedom.factory;

public class MailSender implements Sender {

	@Override
	public void send() {
		System.out.println("mail");

	}

}
创建SMS发送消息的实现类

SmsSender.java

package com.freedom.factory;

public class SmsSender implements Sender {

	@Override
	public void send() {
		System.out.println("sms");

	}

}
接着,建立消息生产工厂

SendFactory.java

package com.freedom.factory;

public class SendFactory {
	//指定生产类型
	public Sender produce(String type){
		if("mail" .equals(type))
			return new MailSender();
		else if("sms" .equals(type))
			return new SmsSender();
		else{
			System.out.println("请输入正确的类型");
			return null;
		}
			
	}

}
最后,我们test一下,看看这个工厂能不能正确生产

@Test
	public void test() {
		SendFactory sf = new SendFactory();
		Sender send = sf.produce("sms");
		send.send();
	}
	
输出结果:sms

二、多个工厂方法模式

对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。关系图:

package com.freedom.factory;

public class SendFactory2 {
	//生产邮件消息
	public Sender produceMail(){
		
		return new MailSender();
		
	}
        //生产SMS消息
	public Sender produceSms(){
		
		return new SmsSender();
		
	}

}
test

@Test
	public void test2() {
		SendFactory2 sf = new SendFactory2();
		Sender send = sf.produceMail();
		send.send();
		Sender send2 = sf.produceSms();
		send2.send();
	}
输出结果:mail

                    sms

三、静态生产工厂方法

将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。

package com.freedom.factory;

public class SendFactory3 {
	
	public static Sender produceMail(){
		
		return new MailSender();
		
	}
	
	public static Sender produceSms(){
		
		return new SmsSender();
		
	}

}
test

@Test
	public void test3() {
		Sender send = SendFactory3.produceMail();
		send.send();
		Sender send2 = SendFactory3.produceSms();
		send2.send();
	}
输出结果同上。

小结:

工厂模式适用范围:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。

在以上的三种模式中,普通工厂方法模式如果传入的字符串有误,不能正确创建对象,静态工厂方法模式相对于多种工厂方法模式,不需要实例化工厂类,所以,大多数情况下,静态工厂方法模式更常用。

缺点:工厂方法模式有一个问题,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。下一篇我们来详细介绍一下抽象工厂模式。


下载源码:http://download.youkuaiyun.com/detail/github_22022001/8290541

Transformer凭什么取代RNN?深入拆解自注意力机制与梯度消失问题的终极对决 本文深入探讨了Transformer如何通过自注意力机制解决RNN的梯度消失问题,成为自然语言处理领域的新标准。通过对比RNN和Transformer的架构差异,揭示了自注意力机制在并行计算、长期依赖处理等方面的技术优势,并提供了实际任务中的性能对比数据。 阅读详情

相关推荐

小白学电路之cadance搭建buffer电路

Buffer(缓冲器)是一种放大器或驱动电路,主要用于隔离输入和输出,以防止负载对前级电路造成干扰或影响。本文作者在电路方面是小白水平,目前正在学习,有不足之处欢迎指正。3.创建新的cellview,对此buffer进行仿真验证。2.创建buffer的symbol。电路中的V2的详细参数。

weixin_58051657的博客 1988

Java设计模式—工厂模式(Factory)

简单工厂模式 业务需求: 披萨项目,便于扩展,便于维护 披萨种类很多 披萨制作 披萨店订购功能 类图 普通代码实现 pizza抽象类 // pizza抽象类 public abstract class Pizza { // pizza名字 protected String name; // 准备材料,不同pizza不一样 public abstract void prepare(); public void bake(){ System.out

super_song的博客 650

实战指南:利用 LangGraph 的状态管理实现多轮对话的上下文隔离与持久化

本文详细介绍了如何利用LangGraph的状态管理机制,高效实现多轮对话中的上下文隔离与持久化。通过实战代码演示,从基础的消息历史管理到自定义状态扩展,再到使用SQLite进行生产级持久化,系统讲解了如何借助LangGraph的State和Checkpointer自动化处理对话记忆、用户隔离及数据存储,显著提升开发效率。

weixin_28396629的博客 488

设计模式学习---Java工厂模式(Factory)

普通工厂模式 概念 普通工厂方法模式就是建立一个工厂类,对实现了同一接口的不同实现类进行实例的创建。实际上就是new对象 类图 右侧一个接口(Sender)两个实现类(MailSender、SmsSender),左侧工厂类(SendFactory)produce方法有一个String类型的参数type,返回值为Sender(构成多态)。代码如下: Sender public interface Sender { // 自定义抽象方法 void send(); } MailSender p

weixin_43420351的博客 1645

ChipCamp探索系列 -- 7A. 开源CPU之BOOM的来龙去脉

本文梳理一下Berkeley的乱序超标量CPU项目----Berkeley Out of Order Machine (BOOM),作为探索7系的首篇(7A)。

ChipCamp的博客---https://chipcamp.blog.youkuaiyun.com/ 1558

STM32 USB AUDIO实战指南——从零构建音频设备

本文详细介绍了如何使用STM32F407构建USB音频设备,从硬件准备到软件配置,再到音频播放和录制功能的实现。通过STM32CubeMX配置和实战代码示例,帮助开发者快速掌握USB Audio Class规范,实现低延迟、高质量的音频传输,适用于语音交互、音乐播放等多种场景。

weixin_42549037的博客 484

Java设计模式之工厂(Factory)

设计模式之工厂设计

代码如诗,人生如画 1972

西门子PLC1200 1214C DC/DC/DC 驱动步进电机

控制电机旋转的指令在“指令”中的“工艺”下的“Motion Control”(若出现程序块无法调用情况,则看备注3的第4条),本篇只介绍常用指令(若想学习详细与更多指令,请参考指令手册)。

2301_79553921的博客 1万+

Java设计模式之工厂模式

工厂模式(Factory Pattern)是创建型设计模式之一,旨在提供一个创建对象的接口,而不是直接通过 `new` 关键字来实例化对象。工厂模式在提高代码的可维护性、可扩展性和灵活性方面具有显著优势。

微笑听雨 7407

基于Simulink的电动汽车电池管理系统热管理优化仿真

电动汽车电池管理系统(Battery Management System, BMS)中的热管理是确保电池性能、安全性和寿命的关键环节。温度过高或过低都会显著影响电池的工作效率和寿命,因此需要对电池组进行精确的热管理。基于MATLAB/Simulink的仿真平台可以用于建模和优化电池热管理系统,包括热分布预测、冷却策略设计以及热平衡控制等。本项目旨在构建一个完整的电动汽车电池热管理优化仿真模型,并通过仿真验证系统的性能。

xiaoheshang_123的博客 462

使用CUDA进行按流排序的内存分配的示例程序

在GPU编程中,按流排序的内存分配是一种常见的优化技术,它可以提高内存访问的效率。通过将内存分配与特定的CUDA流相关联,可以确保在GPU上的并发操作期间,内存分配操作与其他GPU计算操作同时进行,从而减少了潜在的内存访问延迟。请注意,上述示例中的代码仅供参考,并可能需要根据实际需求进行修改和调整。此外,为了完整性,我们省略了一些细节,例如主机指针的分配和释放,以及错误处理和错误检查等。在该示例中,我们创建了4个CUDA流,并使用内存池进行内存分配。然后,我们在每个流上执行了相应的内存访问操作,并使用。

Byte_O_O的博客 282

【设计模式】Java 设计模式之工厂模式(Factory Pattern)

工厂模式是一种创建型设计模式,用于封装对象的创建过程,降低系统耦合度,提高可扩展性和可维护性。它通过将对象的创建逻辑抽象到工厂类中,使客户端代码与具体实现解耦。工厂模式有多种变体,如多重工厂和静态工厂,可根据需求选择。在实际应用中,工厂模式可与其他设计模式结合,如原型、单例和依赖注入,形成更强大的解决方案。然而,过度使用可能导致系统复杂,需谨慎评估。现代框架和库常内置工厂模式,提供便捷的对象创建机制。总之,工厂模式是构建高质量软件系统的有效工具,需结合实际情况灵活运用。

新手村长的专栏 2843

STM32Cube高效开发教程<基础篇>(一)----概述

一、 STM32系列器件和开发工具发展历史声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。本专栏博客参考《STM32Cube高效开发教程(基础篇)》,有意向的读者可以购买正版书籍辅助学习,本书籍由王维波老师、鄢志丹老师、王钊老师倾力打造,书籍内容干货满满。一、 STM32系列器件和开发工具发展历史。

我的博客 1171

java23种常用设计模式之工厂方法模式(Factory Method)2

就举个比较容易理解的例子:人有白、黑、黄三种人,他们都会说会笑,无论什么肤色。类图我就省了,大家有兴趣可以画画。 工厂方法模式: 管你是白的、黑的还是黄的,反正都是人,会说会笑,所以先定义一个人类的接口(Human) package com.freedom.factory.abstractfactory; public interface Human { public void

The code world of freedom 408

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

23种设计模式——工厂方法模式(Factory Method Pattern)详解

本文介绍了23种经典设计模式之——工厂方法模式(Factory Method Pattern)的说明及使用

Meteors.的博客 1381

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Factory Method工厂方法模式(Java代码实现)——创建型模式

对于MessageDigest.getInstance()方法也是如此,比如我们可以通过`MessageDigest.getInstance("MD5");`来获取MD5算法。 并且在Effective Java一书中,第二章第一条就是`用静态工厂方法代替构造器`。

MrYushiwen的博客 1971

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java23种设计模式的研究之一(工厂方法模式(Factory Method))

Java开发工作久了,难免对一些Java中的技术想要探究一番。现在就Java经典的23种设计模式倒腾一番。          1、工厂方法模式: 在我们平时应用中其实工厂方法模式分为3种模式、             1-1:普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。首先看下关系图:                    代码:(借鉴一个邮件发送类和短信发

MsFzzy的博客 425

设计模式之工厂方法模式(Factory Method)

本文介绍Java中23个设计模式中的工厂方法模式。一、概念 工厂方法模式(Factory Method)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂,具体工厂,抽象产品,具体产品。二 、作用 工厂方法经常用在以下两种情况中: 第一种情况是对于某个产

蜗牛要飞的博客 414

Java 之 23 种设计模式解析——1.工厂方法模式(Factory Method)

1、工厂方法模式(Factory Method) 简单工厂模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到工厂方法模式, 创建一个工厂接口和创建多个工厂实现类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了, 不需要修改之前的代码。 请看例子: [java] vi...

毕富国的博客 698

Java GoF 23种设计模式-创建型模式-工厂方法模式(Factory Method Pattern)

文章目录一、模式定义二、模式动机三、模式结构四、代码实现五、缺点 一、模式定义 工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于创建型模式。 在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。 工厂方法模式

WU4566285的博客 432

java factory method_java设计模式:工厂方法模式(Factory Method)

工厂方法模式阅读目录:简单工厂模式介绍UML类图参考代码总结工厂方法模式介绍UML类图参考代码总结前言:《大话设计模式》里有一小节叫'活字印刷,面向对象'的,讲了一个小故事,大意如下:话说三国时期,曹操带领大军驻扎于赤壁。军船相连,气势恢宏,眼看要灭掉东吴,统一天下,曹操甚悦,于是大宴群臣。席间曹操诗兴大发,不觉吟道:"喝酒唱歌,人生真爽。……"。众文武齐呼:"丞相好诗!"。于是一臣子速命印刷工匠...

weixin_39722692的博客 173

23种常用设计模式之工厂模式:工厂方法模式

说明 工厂方法模式(FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品 应用场景 对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。Java Collec...

学而时习之 267

Java开发之设计模式--工厂方法模式(Factory Method)

设计模式第2篇--工厂方法模式(Factory Method)

ZaneLove's blog 1003

工厂方法模式(Factory Method)

工厂模式是一种创建型设计模式,通过将对象创建和使用分离来提升代码扩展性。文章从支付系统案例出发,分析了直接实例化对象的问题(违反开闭原则、代码臃肿),并展示了三种工厂模式的实现方式:简单工厂(单一工厂类)、工厂方法(抽象工厂接口)和抽象工厂(创建产品族)。文章比较了各模式的优缺点,指出工厂方法符合开闭原则但会增加类数量,而抽象工厂适合创建相关对象但扩展困难。最后还介绍了Spring框架中工厂模式的应用(BeanFactory)及其与依赖注入的关系,建议现代开发优先使用DI但需理解工厂模式原理。

m0_56853686的博客 696

Java的23中设计模式之工厂方法模式(二)

一、什么是工厂方法模式 工厂方法模式(FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂、具体工厂、抽象产品、具体产品。 二、工厂方法模式特点 简单工厂模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,...

Aboutdream的博客 329

java设计模式:工厂方法模式(Factory Method)

工厂方法模式 返回设计模式目录 阅读目录: 简单工厂模式 介绍 UML类图 参考代码 总结 工厂方法模式 介绍 UML类图 参考代码 总结 前言:   《大话设计模式》里有一小节叫'活字印刷,面向对象'的,讲了一个小故事,大意如下:   话说三国时期,曹操带领大军驻扎于赤壁。军船相连,气势恢宏,眼看要灭掉东吴,统一天下,曹操甚...

259
上一篇: Android推送 百度云推送 入门篇
下一篇: java23种常用设计模式之抽象工厂模式(Abstract Factory)
freedom1993
博客等级 码龄12年 25粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值