工厂设计模式

article/2025/8/25 0:41:07

1、概念

工厂模式分三种:简单工厂模式、工厂方法模式、抽象工厂模式

  • 简单工厂模式(Simple Factory Pattern):属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂模式严重违背了“开闭原则”,难以拓展。
  • 工厂方法模式(Factory Method):定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
  • 抽象工厂模式(Abstract Factory Pattern):是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
    对比
  • 简单工厂模式代码简单,虽有多处if分支且违背开闭原则,但扩展性和可读性尚可,这样的代码在大多数情况下并无问题。
  • 工厂方法模式通过不同的工厂创建不同的对象,每个对象都有自己的工厂来创建。当对象的创建过程比较复杂,需要组合其他类对象做各种初始化操作时,推荐使用工厂方法模式。
  • 在抽象工厂模式中,工厂不仅可以创建一种对象,还可创建一组对象。是用来解决产品簇的问题,而不是解决调用方的开闭原则的问题。
  • 需求不易改变选择简单工厂;产品等级少选工厂方法;产品等级稳定选抽象工厂。

2、实现

有四种产品ProductA1、ProductA2、ProductB1、ProductB2,假设ProductA1与ProductA2属于一类,ProductB1、ProductB1属于一类,使用简单工厂模式、工厂方法模式、抽象工厂模式实现。

2.1、简单工厂

在这里插入图片描述

package com.mine.design.factory.simple;public interface IProduct {void produce();
}
package com.mine.design.factory.simple;public class ProductA1 implements IProduct {public void produce() {System.out.println("生成产品A1");}}
package com.mine.design.factory.simple;public class ProductA2 implements IProduct {public void produce() {System.out.println("生成产品A2");}}
package com.mine.design.factory.simple;public class ProductB1 implements IProduct {public void produce() {System.out.println("生产产品B1");}}
package com.mine.design.factory.simple;public class SimpleFactory {public static IProduct getProduct(String type) {IProduct product = null;if ("1".equals(type)) {product = new ProductA1();product.produce();} else if ("2".equals(type)) {product = new ProductA2();product.produce();} else if ("3".equals(type)) {product = new ProductB1();product.produce();} else if ("4".equals(type)) {product = new ProductB2();product.produce();}return product;}
}
package com.mine.design.factory.simple;public class Client {public static void main(String[] args) {// 生产产品ASimpleFactory.getProduct("1");// 生产产品A2SimpleFactory.getProduct("2");// 生产产品B1SimpleFactory.getProduct("3");// 生产产品B2SimpleFactory.getProduct("4");}}

2.2、工厂方法

在这里插入图片描述
product相关类参考简单工厂模式

package com.mine.design.factory.method;import com.mine.design.factory.simple.IProduct;public interface IFactory {IProduct getProduct();
}
package com.mine.design.factory.method;import com.mine.design.factory.simple.IProduct;
import com.mine.design.factory.simple.ProductA1;public class FactoryA1 implements IFactory {public IProduct getProduct() {ProductA1 product = new ProductA1();product.produce();return product;}}
package com.mine.design.factory.method;import com.mine.design.factory.simple.IProduct;
import com.mine.design.factory.simple.ProductA2;public class FactoryA2 implements IFactory {public IProduct getProduct() {ProductA2 product = new ProductA2();product.produce();return product;}}
package com.mine.design.factory.method;import com.mine.design.factory.simple.IProduct;
import com.mine.design.factory.simple.ProductB1;public class FactoryB1 implements IFactory {public IProduct getProduct() {ProductB1 product = new ProductB1();product.produce();return product;}}
package com.mine.design.factory.method;import com.mine.design.factory.simple.IProduct;
import com.mine.design.factory.simple.ProductB2;public class FactoryB2 implements IFactory {public IProduct getProduct() {ProductB2 product = new ProductB2();product.produce();return product;}}

2.3、抽象工厂

在这里插入图片描述

package com.mine.design.factory.abs;import com.mine.design.factory.simple.IProduct;public interface IFactory {IProduct getProduct(String type);
}
package com.mine.design.factory.abs;import com.mine.design.factory.simple.IProduct;
import com.mine.design.factory.simple.ProductA1;
import com.mine.design.factory.simple.ProductA2;public class FactoryA implements IFactory {public IProduct getProduct(String type) {IProduct product = null;if ("1".equals(type)) {product = new ProductA1();product.produce();} else if ("2".equals(type)) {product = new ProductA2();product.produce();}return product;}}
package com.mine.design.factory.abs;import com.mine.design.factory.simple.IProduct;
import com.mine.design.factory.simple.ProductB1;
import com.mine.design.factory.simple.ProductB2;public class FactoryB implements IFactory {public IProduct getProduct(String type) {IProduct product = null;if ("1".equals(type)) {product = new ProductB1();product.produce();} else if ("2".equals(type)) {product = new ProductB2();product.produce();}return product;}}
package com.mine.design.factory.abs;public class Client {public static void main(String[] args) {// 生产产品Anew FactoryA().getProduct("1");// 生产产品A2new FactoryA().getProduct("2");// 生产产品B1new FactoryB().getProduct("1");// 生产产品B2new FactoryB().getProduct("2");}}

http://chatgpt.dhexx.cn/article/uBu0qZTJ.shtml

相关文章

设计模式之工厂模式(factory pattern)

工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。该模式用于封装和管理对象的创建,是一种创建型模式。本文从一个具体的例子逐步深入分析,来体会三种工厂模式的应用场景和…

sqlserver2008的SSMS连接sqlserver2016的时候提示‘索引超出了数组界限。’

解决:打sp3补丁。 http://www.microsoft.com/en-us/download/details.aspx?id44271

Matlab报错 :“位置 x 处的索引超出数组边界”

经常遇到“位置 x 索引超出数组边界”的报错,今天突然想到一个以前一直没有太留意的奇葩问题:这个报错里“位置x”指的是哪里?为什么一会是“位置3”,一会是“位置1”,有什么神秘的规矩吗? 善用搜索没发现…

.net reflector 反编译失败 索引超出了数组界限问题处理方法

.net reflector 反编译失败 索引超出了数组界限问题处理方法 时间:9个月前 作者:庞顺龙 浏览:177 [站内原创,转载请注明出处] 标签: Reflector .net reflector 反编译失败 索引超出了数组界限问题处理方法 de…

matlab索引超出数组边界且不提示数组边界的一种处理办法

问题如下。 相关代码如下: 问题原因如下: 将excel表另存为txt时选择的保存类型是Unicode文本(*.txt)。 处理办法。 将Unicode文本(*.txt)换成文本文件(制表符分隔)(*.txt)。 问题的表现如下: 利用matlab工作区发现…

最短路径算法详细介绍

据 Drew 所知最短路经算法现在重要的应用有计算机网络路由算法,机器人探路,交通路线导航,人工智能,游戏设计等等。美国火星探测器核心的寻路算法就是采用的D*(D Star)算法。 最短路经计算分静态最短路计算和…

[算法]-最短路径算法总结

Dijkstra最短路径算法 按路径长度的递增次序,逐步产生最短路径的贪心算法 基本思想:首先求出长度最短的一条最短路径,再参照它求出长度次短的一条最短路径,依次类推,直到从顶点v 到其它各顶点的最短路径全部求出为止。 时间复杂…

c++实现最短路径算法(Dijkstra算法)

0简介 Dijkstra算法是一种计算某一顶点到其余顶点最短路径的算法。它采用了贪心的策略,实现时使用了广度优先。这个算法常学常忘,因此写篇博客彻底解决它。 1计算步骤介绍 Dijkstra的计算步骤不难,如下 (1)设置一个集合表示已经标记过的节…

最短路径算法——dijkstra

dijkstra 前提:在一张图里,不能有权值为负数的边。 给你一个出发点,求出发点到所有结点的最短距离是多少?如果无法到达某个点,则到这个点的距离是正无穷(一般出现在有向图里面)。 举个&#…

最短路径算法详解

前言: 最短路径算法:用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。 例子: 暑期,你想要出门去旅游,但是在你出发之前,你想知道任意…

基于java最短路径算法的简单实现

一、我们先画一个可达路径图表: -1表示不可直达,0表示自己,其他整数表示长度或者权重 ABCDA012-1B-1015C-1-101D-1-1-10 用图形可表示为: 二、算法思路 1、先列出所有保存所有节点到可达节点的路径二维表 2、逐步寻找从起始节点到…

最短路径算法及应用

乘汽车旅行的人总希望找出到目的地的尽可能的短的行程。如果有一张地图并在图上标出每对十字路口之间的距离,如何找出这一最短行程?  一种可能的方法就是枚举出所有路径,并计算出每条路径的长度,然后选择最短的一条。那么我们很…

关于最短路径算法的理解

“最短路径算法:Dijkstra算法,Bellman-Ford算法,Floyd算法和SPFA算法等。​从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径叫做最短路径。” 我们解决最短路径问题,常用的是Dijkstra…

最短路径算法-----Dijkstra迪杰斯特拉算法

最近巩固一下算法,提高自己内力,网上看到查看到这篇介绍很详细的《Dijkstra迪杰斯特拉算法》,在这里转载记录一下。 1 前言 本章介绍迪杰斯特拉算法。和以往一样,本文会先对迪杰斯特拉算法的理论论知识进行介绍,然后给…

Dijkstra 最短路径算法 Python 实现

原文链接 问题描述 使用 Dijkstra 算法求图中的任意顶点到其它顶点的最短路径(求出需要经过那些点以及最短距离)。 以下图为例: 算法思想 可以使用二维数组来存储顶点之间边的关系 首先需要用一个一维数组 dis 来存储 初始顶点到其余各个顶…

神经网络最短路径算法,最短路径算法的原理

节约里程法求解最短路问题 你只要记住2点之间直线最短。节约里程法是用来解决运输车辆数目不确定的问题的最有名的启发式算法。1、节约里程法优化过程分为并行方式和串行方式两种。 核心思想是依次将运输问题中的两个回路合并为一个回路,每次使合并后的总运输距离…

最短路径算法及Python实现

最短路径问题 在图论中,最短路径问题是指在一个有向或无向的加权图中找到从一个起点到一个终点的最短路径。这个问题是计算机科学中的一个经典问题,也是许多实际问题的基础,例如路线规划、通信网络设计和交通流量优化等。在这个问题中&#…

图论:图的四种最短路径算法

目录: 1.DFS(单源最短路径算法) 例题1: DFS题目分析: 代码DFS: 2.Floyed(时间复杂度On^3) 1.应用场景: 2.解析算法: 核心代码1: 我的笔…

图的五种最短路径算法

本文总结了图的几种最短路径算法的实现:深度或广度优先搜索算法,费罗伊德算法,迪杰斯特拉算法,Bellman-Ford 算法。 1)深度或广度优先搜索算法(解决单源最短路径) 从起点开始访问所有深度遍历路径或广度优先路径,则到达终点节点的路径有多条,取其中路径权值最短的一…

最短路径算法——Dijkstra算法——python3实现

本文参考来自数据结构与算法分析 java语言描述。 文章目录 问题描述问题分析实现过程如何使用数据变化表代码实现优先队列中的堆排序使用set代替优先队列得到最短路径 负权边算法改进(若为无圈图) 问题描述 现有一个有向赋权图。如下图所示:…