Java工厂设计模式

article/2025/8/24 23:50:03

工厂设计模式

    • 一、面向对象的设计原则
      • 1.1 OCP(开闭原则,Open-Closed Principle)
      • 1.2 DIP(依赖倒转原则,Dependence Inversion Principle)
      • 1.3 LOD(迪米特法则,Law Of Demeter)
    • 二、工厂模式的分类
      • 2.1 无工厂模式
      • 2.2 简单工厂模式
      • 2.3 工厂方法模式
      • 2.4 抽象工厂模式

接口的应用:工厂模式

工厂模式实现了创建者与调用者的分离,即将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。

其实设计模式和面向对象设计原则都是为了使得开发项目更加容易扩展和维护,解决方式就是一个“分工”。社会的发展也是这样,分工越来越细。
比如:

原始社会的人:人什么都要会,自己种,自己打猎,自己织衣服,自己治病
现在的人:可以只会一样,其他都不会,只会 Java也能活,不会做饭,不会开 车,不会…

一、面向对象的设计原则

(总共六个):这里说几个和工厂模式相关的

1.1 OCP(开闭原则,Open-Closed Principle)

一个软件的实体应当对扩展开放,对修改关闭。当我们写完的代码,不能因为需求变化就修改。我们可以通过新增代码的方式来解决变化的需求。如果每次需求变动都去修改原有的代码,那原有的代码就存在被修改错误的风险,当然这其中存在有意和无意的修改,都会导致原有正常运行的功能失效的风险,这样很有可能会展开可怕的蝴蝶效应,使维护工作剧增。说到底,开闭原则除了表面上的可扩展性强以外,在企业中更看重的是维护成本。
所以,开闭原则是设计模式的第一大原则,它的潜台词是:控制需求变动风险,缩小维护成本。

1.2 DIP(依赖倒转原则,Dependence Inversion Principle)

要针对接口编程,不要针对实现编程。

如果 A 中关联 B,那么尽量使得 B 实现某个接口,然后 A 与接口发生关系,不与 B 实现类发生关联关系。

依赖倒置的潜台词是:面向抽象编程,解耦调用和被调用者。

1.3 LOD(迪米特法则,Law Of Demeter)

只与你直接的朋友通信,而避免和陌生人通信。
要求尽量的封装,尽量的独立,尽量的使用低级别的访问修饰符。这是封装特性的典型体现。
一个类如果暴露太多私用的方法和字段,会让调用者很茫然。并且会给类造成不必要的判断代码。所以,我们使用尽量低的访问修饰符,让外界不知道我们的内部。这也是面向对象的基本思路。这是迪米特原则的一个特性,无法了解类更多的私有信息。另外,迪米特原则要求类之间的直接联系尽量的少,两个类的访问,通过第三个中介类来实现。

迪米特原则的潜台词是:不和陌生人说话,有事去中介

二、工厂模式的分类

简单工厂模式:用来生产同一等级结构中的任意产品。(对于增加新的产品,需要修改已有代码)
工厂方法模式:用来生产同一等级结构中的固定产品。(支持增加任意产品)
抽象工厂模式:用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)

核心本质:
实例化对象,用工厂方法代替 new 操作。将选择实现类、创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。

2.1 无工厂模式

package com.atguigu.pattern.factory.nofactory;
interface Car{void run();
}
class Audi implements Car{public void run() {System.out.println("奥迪在跑");}
}
class BYD implements Car{public void run() {System.out.println("比亚迪在跑");}
}
public class Client01 {public static void main(String[] args) {Car a = new Audi();Car b = new BYD();a.run();b.run();}
}

在这里插入图片描述

2.2 简单工厂模式

简单工厂模式,从命名上就可以看出这个模式一定很简单。它存在的目的很简单:
定义一个用于创建对象的工厂类。

package com.atguigu.pattern.factory.simple;
interface Car {void run();
}
class Audi implements Car {public void run() {System.out.println("奥迪在跑");}
}
class BYD implements Car {public void run() {System.out.println("比亚迪在跑");}
}//工厂类
class CarFactory {//方式一public static Car getCar(String type) {if ("奥迪".equals(type)) {return new Audi();} else if ("比亚迪".equals(type)) {return new BYD();} else {return null;}}
//方式二
// public static Car getAudi() {
// return new Audi();
// }
//
// public static Car getByd() {
// return new BYD();
// }
}
public class Client02 {public static void main(String[] args) {Car a = CarFactory.getCar("奥迪");a.run();Car b = CarFactory.getCar("比亚迪");b.run();}
}

在这里插入图片描述
调用者只要知道他要什么,从哪里拿,如何创建,不需要知道。分工,多出了一个专门生产 Car 的实现类对象的工厂类。把调用者与创建者分离。
小结:
简单工厂模式也叫静态工厂模式,就是工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的实例对象。
缺点:对于增加新产品,不修改代码的话,是无法扩展的。违反了开闭原则(对扩展开放;对修改封闭)。

2.3 工厂方法模式

为了避免简单工厂模式的缺点,不完全满足 OCP(对扩展开放,对修改关闭)。工厂方法模式和简单工厂模式最大的不同在于,简单工厂模式只有一个(对于一个项目或者一个独立的模块而言)工厂类,而工厂方法模式有一组实现了相同接口的工厂类。
这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。

package com.atguigu.pattern.factory.method;
interface Car{void run();
}
//两个实现类
class Audi implements Car{public void run() {System.out.println("奥迪在跑");}
}
class BYD implements Car{public void run() {System.out.println("比亚迪在跑");}
}
//工厂接口
interface Factory{Car getCar();
}
//两个工厂类
class AudiFactory implements Factory{public Audi getCar(){return new Audi();}
}
class BydFactory implements Factory{public BYD getCar(){return new BYD();}
}
public class Client {public static void main(String[] args) {Car a = new AudiFactory().getCar();Car b = new BydFactory().getCar();a.run();b.run();}
}

在这里插入图片描述
总结:
简单工厂模式与工厂方法模式真正的避免了代码的改动了?没有。在简单工厂模式中,新产品的加入要修改工厂角色中的判断语句;而在工厂方法模式中,要么将判断逻辑留在抽象工厂角色中,要么在客户程序中将具体工厂角色写死(就像上面的例子一样)。而且产品对象创建条件的改变必然会引起工厂角色的修改。面对这种情况,Java 的反射机制与配置文件的巧妙结合突破了限制——这在Spring 中完美的体现了出来。

2.4 抽象工厂模式

抽象工厂模式和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。

抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。

而且使用抽象工厂模式还要满足一下条件:

(1) 系统中有多个产品族,而系统一次只可能消费其中一族产品。
(2) 同属于同一个产品族的产品以其使用。


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

相关文章

设计模式—工厂设计模式

工厂设计模式 1.概述2.简单工厂模式2.1 结构2.2 实现2.3 优缺点2.4 扩展 3.工厂方法模式3.1 概述3.2 结构3.3 实现3.4 优缺点 4.抽象工厂模式4.1 概述4.2 结构4.3 实现4.4 优缺点4.5 应用场景 5.扩展模式5.1 第一步:定义配置文件5.2 改写工厂类 6.JDK源码解析—Coll…

工厂设计模式 - 详解

介绍 工厂模式是Java中最常用的设计模式之一,这种类型的设计模式数据创建型模式。 主要就是负责创建对象的,当我们使用new创建对象的时候会导致对该对象的耦合性很严重,当我们需要修改的时候需要对所有new的对象进行修改,违反了软…

【iOS】—— 工厂设计模式

工厂设计模式 文章目录 工厂设计模式设计模式概念设计模式七大准则开闭原则单⼀职责原则里氏替换原则依赖倒转原则接口隔离原则迪米特法则合成复用原则 类族模式简单工厂模式优点缺点主要作用示例文件分类实现效果: 工厂方法模式优点缺点主要作用:示例&a…

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

1. 概述 工厂模式(Factory Pattern)是最常用的设计模式之一,它属于创建类型的设计模式。它提供了一种创建对象的最佳方式,在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过一个共同的接…

设计模式之工厂模式,史上最强,不服来辩!

设计模式是对大家实际工作中写的各种代码进行高层次抽象的总结,如果设计模式没学会,抽象能力肯定就不会太强。常见的设计模式有 23 种,今天我们只聊最简单的工厂模式。 工厂模式是属于创建型模式的,通过工厂获取一个一个的新对象。…

工厂设计模式

1、概念 工厂模式分三种:简单工厂模式、工厂方法模式、抽象工厂模式 简单工厂模式(Simple Factory Pattern):属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例&#xf…

设计模式之工厂模式(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 前言 本章介绍迪杰斯特拉算法。和以往一样,本文会先对迪杰斯特拉算法的理论论知识进行介绍,然后给…