创建型-工厂相关设计模式
迪丽瓦拉
2025-05-28 07:09:48
0

目录

工厂模式

工厂方法模式

抽象工厂

小结


工厂模式

没有使用设计模式之前代码可能是这样的

public class WithoutFactoryPatternDemo {public static void main(String[] args) {Product product1=new Product("产品1");System.out.println(product1);}public static class Product {private String name;public Product(String name) {super();this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Product [name=" + name + "]";}}public static class Product2 {private String name;public Product2(String name) {super();this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Product [name=" + name + "]";}}}

在使用的地方 new出相应的对象, 如果我们需要将Product换成Product2 , 那么所有new 的地方都需要更新, 简直是噩梦, 所以就有了工厂模式的出现来简化这种场景带来的问题

public class FactoryPatternDemo {public static void main(String[] args) {Product product = ProductFactory.create();product.execute();}public interface Product {void execute();}public static class ProductImpl1 implements Product {@Overridepublic void execute() {System.out.print("产品1的功能实现");  }}public static class ProductImpl2 implements Product {@Overridepublic void execute() {System.out.print("产品1的功能实现");  }}public static class ProductFactory {public static Product create() {return new ProductImpl2();}}
}

使用了工厂模式以后, new的地方只有 一个, 如果需要更换类, 更换一个地方就可以

工厂方法模式

不使用模版方法模式, 可能是这样的

public class WithoutFactoryMethodPatternDemo {public static void main(String[] args) {Product product1 = Product1Factory.createProduct();Product product2 = Product2Factory.createProduct();Product product3 = Product3Factory.createProduct();product1.execute();product2.execute();product3.execute();}public interface Product {void execute();}public static class Product1 implements Product {@Overridepublic void execute() {System.out.println("产品1的功能逻辑");}}public static class Product2 implements Product {@Overridepublic void execute() {System.out.println("产品2的功能逻辑");}}public static class Product3 implements Product {@Overridepublic void execute() {System.out.println("产品3的功能逻辑");}}public static class Product1Factory {public static Product createProduct() {System.out.println("生产产品的通用逻辑,修改");  System.out.println("生产产品1的特殊逻辑");return new Product1();}}public static class Product2Factory {public static Product createProduct() {System.out.println("生产产品的通用逻辑,修改");  System.out.println("生产产品2的特殊逻辑");return new Product2();}}public static class Product3Factory {public static Product createProduct() {System.out.println("生产产品的通用逻辑");  System.out.println("生产产品3的特殊逻辑");return new Product3();}}
}

很明显是工厂模式, 但是有问题,  那就是每个构造方法里面 都有相同的逻辑代码, 如果需要修改这段代码, 那么所有的地方都需要改,  工厂方法模式就是来改变这种状况

实现方式就是将工厂方法抽取出抽象类, 然后在构造流程上将公共的部分抽取到抽象类中

public static void main(String[] args) {Product product1 = Product1Factory.get().createProduct();Product product2 = Product2Factory.get().createProduct();Product product3 = Product3Factory.get().createProduct();product1.execute();product2.execute();product3.execute();}public interface Product {void execute();}public static class Product1 implements Product {@Overridepublic void execute() {System.out.println("产品1的功能逻辑");}}public static class Product2 implements Product {@Overridepublic void execute() {System.out.println("产品2的功能逻辑");}}public static class Product3 implements Product {@Overridepublic void execute() {System.out.println("产品3的功能逻辑");}}public static abstract class AbstractProductFactory {public Product createProduct() {commonCreate();return specificCreate();}private void commonCreate() {System.out.println("生产产品的通用逻辑,修改");  }protected abstract Product specificCreate();}public static class Product1Factory extends AbstractProductFactory {private static final Product1Factory instance = new Product1Factory();private Product1Factory() {}public static Product1Factory get() {return instance;}@Overridepublic Product specificCreate() {System.out.println("生产产品1的特殊逻辑");return new Product1();}}public static class Product2Factory extends AbstractProductFactory {private static final Product2Factory instance = new Product2Factory();private Product2Factory() {}public static Product2Factory get() {return instance;}@Overridepublic Product specificCreate() {System.out.println("生产产品2的特殊逻辑");return new Product2();}}public static class Product3Factory extends AbstractProductFactory {private static final Product3Factory instance = new Product3Factory();private Product3Factory() {}public static Product3Factory get() {return instance;}@Overridepublic Product specificCreate() {System.out.println("生产产品3的特殊逻辑");return new Product3();}}}

抽象工厂

不使用抽象工厂可能是这样

public class WithoutAbstractFactoryPatternDemo {public static void main(String[] args) {// 我们现在要创建产品A1+产品B1的组合
//		ProductA productA1 = new ProductA1();
//		ProductB productB1 = new ProductB1();
//		
//		productA1.execute();
//		productB1.execute();// 变成产品A1+产品B3的组合ProductA productA1 = new ProductA1();ProductB otherProductB3 = new ProductB3();productA1.execute();otherProductB3.execute();// 我们现在要创建产品A2+产品B2的组合ProductA productA2 = new ProductA2();ProductB productB2 = new ProductB2();productA2.execute();productB2.execute();// 我们现在要创建产品A3+产品B3的组合ProductA productA3 = new ProductA3();ProductB productB3 = new ProductB3();productA3.execute();productB3.execute();}public interface ProductA {void execute();}public static class ProductA1 implements ProductA {@Overridepublic void execute() {System.out.println("产品A1的功能逻辑");}}public static class ProductA2 implements ProductA {@Overridepublic void execute() {System.out.println("产品A2的功能逻辑");}}public static class ProductA3 implements ProductA {@Overridepublic void execute() {System.out.println("产品A3的功能逻辑");}}public interface ProductB {void execute();}public static class ProductB1 implements ProductB {@Overridepublic void execute() {System.out.println("产品B1的功能逻辑");}}public static class ProductB2 implements ProductB {@Overridepublic void execute() {System.out.println("产品B2的功能逻辑");}}public static class ProductB3 implements ProductB {@Overridepublic void execute() {System.out.println("产品B3的功能逻辑");}}}

问题是,调整产品组合的这个行为,如果你手动创建产品组合的代码,有100个地方,A1+B1
一旦要调整,就是要对100个地方的代码,手动一点一点的去修改,组合的逻辑
不可维护,不可扩展,  于是抽象方法模式,解决这个问题, 将组合抽象到一个工厂中

public class AbstractFactoryPatternDemo {public static void main(String[] args) {// 产品A1+产品B1 -> 产品A1+产品B3ProductA firstProductA = Factory1.get().createProductA();ProductB firstProductB = Factory1.get().createProductB();firstProductA.execute();firstProductB.execute();// 产品A2+产品B2ProductA secondProductA = Factory2.get().createProductA();ProductB secondProductB = Factory2.get().createProductB();secondProductA.execute();secondProductB.execute();// 产品A3+产品B3ProductA thirdProductA = Factory3.get().createProductA();ProductB thirdProductB = Factory3.get().createProductB();thirdProductA.execute();thirdProductB.execute();// 哪怕你有100个地方定义了产品组合,要调整组合的逻辑,只要修改一个工厂就可以了}public interface ProductA {void execute();}public static class ProductA1 implements ProductA {@Overridepublic void execute() {System.out.println("产品A1的功能逻辑");}}public static class ProductA2 implements ProductA {@Overridepublic void execute() {System.out.println("产品A2的功能逻辑");}}public static class ProductA3 implements ProductA {@Overridepublic void execute() {System.out.println("产品A3的功能逻辑");}}public interface ProductB {void execute();}public static class ProductB1 implements ProductB {@Overridepublic void execute() {System.out.println("产品B1的功能逻辑");}}public static class ProductB2 implements ProductB {@Overridepublic void execute() {System.out.println("产品B2的功能逻辑");}}public static class ProductB3 implements ProductB {@Overridepublic void execute() {System.out.println("产品B3的功能逻辑");}}public interface Factory {ProductA createProductA();ProductB createProductB();}public static class Factory1 implements Factory {private static final Factory1 instance = new Factory1();private Factory1() {}public static Factory get() {return instance;}@Overridepublic ProductA createProductA() {return new ProductA1();}@Overridepublic ProductB createProductB() {return new ProductB3(); }}public static class Factory2 implements Factory {private static final Factory2 instance = new Factory2();private Factory2() {}public static Factory get() {return instance;}@Overridepublic ProductA createProductA() {return new ProductA2();}@Overridepublic ProductB createProductB() {return new ProductB2(); }}public static class Factory3 implements Factory {private static final Factory3 instance = new Factory3();private Factory3() {}public static Factory get() {return instance;}@Overridepublic ProductA createProductA() {return new ProductA3();}@Overridepublic ProductB createProductB() {return new ProductB3(); }}}

小结

工厂相关的设计模式是创建型的设计模式

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...