Java设计模式-2、⼯⼚模式

⼯⼚模式

工厂模式是对简单工厂的一个衍生,解决了许多简单工厂模式的问题。

一、说⼀说简单⼯⼚模式

简单⼯⼚模式指由⼀个⼯⼚对象来创建实例,客户端不需要关注创建逻 辑,只需提供传⼊⼯⼚的参数。

 适⽤于⼯⼚类负责创建对象较少的情况,缺点是如果要增加新产品,就需 要修改⼯⼚类的判断逻辑,违背开闭原则,且产品多的话会使⼯⼚类⽐较 复杂。 Calendar 抽象类的 getInstance ⽅法,调⽤ createCalendar ⽅法根据不同 的地区参数创建不同的⽇历对象。

Spring 中的 BeanFactory 使⽤简单⼯⼚模式,根据传⼊⼀个唯⼀的标识来 获得 Bean 对象。这也是事先定义好bean标识和bean的关联关系。

代码:

1定义接口

/**
 * 形状接口
 */
public interface Shape {
     void draw();
}

2 实现类

public class Circle implements Shape {

	public Circle() {
		System.out.println("Circle");
	}
	
	public void draw() {
		System.out.println("画圆");
	}
}
public class Rectangle implements Shape {

	public Rectangle() {
		System.out.println("Rectangle");
	}
	
	public void draw() {
		System.out.println("画长方形");
	}
}
public class Square implements Shape {

	public Square() {
		System.out.println("Square");
	}
	
	public void draw() {
		System.out.println("画正方形");
	}
}

3. 定义简单工厂

public class ShapeFactory {
	public static Shape getShape(String shapeType) {
		if (shapeType == null) {
			return null;
		}
		if (shapeType.equalsIgnoreCase("CIRCLE")) {
			return new Circle();
		} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
			return new Rectangle();
		} else if (shapeType.equalsIgnoreCase("SQUARE")) {
			return new Square();
		}
		return null;
	}
}

4. 测试类

	public static void main(String[] args) {
		//违反开闭原则
		 Shape circle = ShapeFactory.getShape("CIRCLE");
		 circle.draw(); Shape rectangle = ShapeFactory.getShape("RECTANGLE");
		 rectangle.draw(); Shape square = ShapeFactory.getShape("SQUARE");
		 square.draw();
}

5 :结果

二、⼯⼚⽅法模式了解吗? 

和简单⼯⼚模式中⼯⼚负责⽣产所有产品相⽐,⼯⼚⽅法模式将⽣成具体 产品的任务分发给具体的产品⼯⼚。不再是单一工厂。

代码:

1、之前代码基础上加上 工厂接口

/**
 *  
 * @author WHM
 *
 */
public interface Factory {
	public Shape getShape();
}

2 实现工厂类,生成A产品

public class CircleFactory implements Factory {

	@Override
	public Shape getShape() {
		return new Circle();
	}

}

生产B产品

public class RectangleFactory implements Factory {

	public Shape getShape() {
		return new Rectangle();
	}

}

 C产品

public class SquareFactory implements Factory {

	public Shape getShape() {
		return new Square();
	}

}

 3. 测试类

public class updateMain {
	public static void main(String[] args) {
		//画圆工厂
	    Factory circleFac = new CircleFactory();
	    //不需要指导谁执行
	    Shape circle = circleFac.getShape();
	    //直接ִ执行画圆方法
	    circle.draw();
	}
}

总结:

这里这样设计的好处,就是如果需要加新产品,只需要新增实现类就行了,不需要去改原来的代码了。这就易于扩展,解决了简单工厂的缺点。

 三、抽象⼯⼚模式了解吗?

 简单⼯⼚模式和⼯⼚⽅法模式不管⼯⼚怎么拆分抽象,都只是针对⼀类产 品,如果要⽣成另⼀种产品,就⽐较难办了!

抽象⼯⼚模式通过在 AbstarctFactory 中增加创建产品的接⼝,并在具体⼦ ⼯⼚中实现新加产品的创建,当然前提是⼦⼯⼚⽀持⽣产该产品。否则继 承的这个接⼝可以什么也不⼲。

从上⾯类图结构中可以清楚的看到如何在⼯⼚⽅法模式中通过增加新产品 接⼝来实现产品的增加的。抽象工厂跟工厂方法模式一个本质就是,抽象工厂模式有一个超级工厂。 

代码:

1. 产品接口

/**
 * 生产可乐
 * @author WHM
 *
 */
public interface Cole {
	public void cl();
}
/**
 * 生产汉堡包
 * @author WHM
 *
 */
public interface Humburg {
    public void hb();
}

2. 工厂接口

/**
 * 工厂(组合生产对象)
 * @author WHM
 *
 */
public interface Factory {
	//生产汉堡包
	public Humburg scHbb();
	//生产可乐
    public Cole scKl();
}

3.产品实现类

public class KdjHbb implements Humburg {

	public void hb() {
		System.out.println("肯德基的汉堡包");
	}

}
public class KdjKl implements Cole {

	public void cl() {
		System.out.println("肯德基的可乐");
	}
}

     

public class MDLCole implements Cole {

	public void cl() {
		System.out.println("麦当劳的可乐");
	}

}

public class MdlHbb implements Humburg {

	public void hb() {
		System.out.println("麦德劳的汉堡包");
	}

}

 4 工厂实现类

package designpattern.factory.abstrac;

public class MdlFactory implements Factory {

	public Humburg scHbb() {
		return new MdlHbb();
	}
	
	public Cole scKl() {
		return new MDLCole();
	}
}

package designpattern.factory.abstrac;

/**
 *  抽象工厂实现
 * @author WHM
 *
 */
public class KdjFactory implements Factory {

	public Humburg scHbb() {
		return new KdjHbb();
	}

	public Cole scKl() {
		return new KdjKl();
	}
}

 5 测试类

package designpattern.factory.abstrac;

/**
 * 生产一组产品。交由谁生产      
 * 区别:
 * 工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)   
 * 抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族) 
 * @author WHM
 *
 */
public class TMain {
	
	public static void main(String[] args) {
		KdjFactory Kdj=new KdjFactory();
        Humburg hb1= Kdj.scHbb();
        hb1.hb();
        Cole cole= Kdj.scKl();
        cole.cl();
        MdlFactory mdl=new MdlFactory();
        Humburg hb2=mdl.scHbb();
        hb2.hb();
        Cole cole2 =mdl.scKl();
        cole2.cl();
	}
}

 6 结果

四、总结:

       本文主要对于工厂模式进行了介绍主要介绍了简单工厂模式工厂方法模式以及抽象工厂模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/4497.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

wait讲解

hello啊,今天为大家带来wait的相关介绍 开始正题之前,我们要先进行一点知识点的补充 上一期我们更新了一期关于线程安全的知识,对于volatile在这里在做出一些补充 有些文章上说线程修改一个变量的时候,从主内存读取到工作内存上,在工作内存上修改完以后再返回主内存 由于t1线程…

[数据库原理与应用]educoder-MySQL 单表查询(一)

目录 第1关:用like匹配字符串 第2关:用BETWEEN AND表达查询范围 第3关:空值的判断 第4关:集合运算符IN的应用 第5关:消除重复结果 第6关:聚合函数应用 第7关:分组查询 第8关&#xf…

基于GPT3.5实现本地知识库解决方案-利用向量数据库和GPT向量接口-实现智能回复并限制ChatGPT回答的范围...

标题有点长,但是基本也说明出了这篇文章的主旨,那就是利用GPT AI智能回答自己设置好的问题 既能实现自己的AI知识库机器人,又能节省ChatGPT调用的token成本费用。 代码仓库地址 document.ai: 基于GPT3.5的通用本地知识库解决方案 下面图片是整…

【数据分析实战】基于python对Airbnb房源进行数据分析

文章目录📚引言📖数据加载以及基本观察📃缺失值观察及处理🔖缺失值观察以及可视化🔖缺失值处理📃异常值观察及处理📖数据探索💡哪个区域的房源最受欢迎?💡哪种…

完全二叉树的4种遍历方式

一张二叉树的图 1&#xff0c;二叉树的特点 每个点p的左儿子是p*2,右儿子是p*21&#xff0c;可以分别表示为p<<1与p<<1|1节点的序号是从左到右&#xff0c;从上到下增加的每个点至多2个儿子&#xff08;屁话&#xff08;bushi&#xff09;&#xff09; 2&#xff…

C语言自定义数据类型(六)使用枚举类型

目录 一、定义 二、详解 三、举例说明 一、定义 如果一个变量只有几种可能的值&#xff0c;则可以定义为枚举 (enumeration) 类型&#xff0c;所谓 “ 枚举 ” 就是指把可能的值一一列举出来&#xff0c;变量的值只限于列举出来的值的范围内。 声明枚举类型用 enum 开头。…

UR5 D-H信息 | UR5结构图 | UR5连杆名关节名 | UR5模型信息 | UR5 UDFR信息

这个问题遇到好多次了&#xff0c;不管是仿真还是可视化&#xff0c;都需要我清楚的掌握ur5的URDF信息。但是看官网的Ur5.urdf真的是看的迷迷糊糊的&#xff0c;总是无法把ur5机器人的某个部位和她的名字对应起来。之前都搞不太明白&#xff0c;今天好好整理一下&#xff0c;分…

工赋开发者社区 | 做好生产线的规划与布局,能给工厂带来什么好处?

导读工厂规划布局就是对设备、工作台、物料、工装、半成品、水、电、气等的综合配置&#xff0c;主要是研究工序之间、车间之间以及工厂整体配置的合理性&#xff0c;以达到整个生产系统的人流与物流畅通化、搬运最优化、流程最优化、效率最大化的目标。“想优化工厂空间&#…

NIO Reactor模型(含代码)

概览 我们知道NIO就是调用系统内核的的select/poll/epoll方法来实现&#xff0c;这些系统内核方法会扫描或监控IO&#xff0c;每次将所有的IO的状态返回给NIO线程。让NIO线程可以选择处理读取可读状态的IO流&#xff0c;也可以选择继续监控轮询监控IO的其它状态。 reactor模型也…

【web前端开发】超详细讲解CSS盒子模型

文章目录1.盒子模型介绍2.内容3.边框4.内边距5.⭐盒子大小计算6.⭐内减模式7.外边距外边距的合并外边距的塌陷行内元素的垂直外边距8.⭐清除默认样式9.⭐版心居中1.盒子模型介绍 所有HTML元素可以看作盒子,CSS盒模型本质上是一个盒子&#xff0c;封装周围的HTML元素&#xff0c…

C#多线程锁

背景&#xff1a;再一次测试中用户和我几乎同一时刻&#xff08;不知道谁先谁后&#xff0c;估计间隔在毫秒级&#xff09;操作了系统。 用户那边反馈显示的操作日志是我登录的信息。于是开始查找问题。首先排除了全局变量先后操作被覆盖的原因。首先A账户登录&#xff0c;然后…

基于stm32mp157 linux开发板ARM裸机开发教程3:Cortex-A7 架构与工作模式(连载中)

前言&#xff1a; 目前针对ARM Cortex-A7裸机开发文档及视频进行了二次升级持续更新中&#xff0c;使其内容更加丰富&#xff0c;讲解更加细致&#xff0c;全文所使用的开发平台均为华清远见FS-MP1A开发板&#xff08;STM32MP157开发板&#xff09; 针对对FS-MP1A开发板&…

用 ChatGPT 尝试 JavaScript 交互式学习体验,有用但不完美

很好&#xff0c;但还不能取代专家导师&#xff0c;有时还会犯错&#xff01;ChatGPT 教小狗编程&#xff08; Midjourney 创作&#xff09;GPT-4刚刚发布&#xff0c;相较于GPT-3.5&#xff0c;它有显著的增强功能。其中之一是它在更长时间的交互和更大的提示下&#xff0c;能…

Pytorch环境配置 完整流程 从CUDA和cuDNN到Torch安装

目录1. 安装CUDA2. 安装cuDNN3. 安装Pytorch1. 安装CUDA 确认需要的CUDA版本 nvidia-smi 下载CUDA.exe CUDA下载地址 结合自己电脑的情况下载对印度个版本 安装 双击后安装&#xff0c;可以修改安装路径&#xff0c;我安装在了D盘 安装方式选择自定义 全部勾选 这里如果电脑没…

nnAudio的简单介绍

官方实现 https://github.com/KinWaiCheuk/nnAudio&#xff1b; 论文实现&#xff1a; nnAudio: An on-the-Fly GPU Audio to Spectrogram Conversion Toolbox Using 1D Convolutional Neural Networks&#xff1b; 以下先对文章解读&#xff1a; abstract 在本文中&#x…

美国站针对磁铁产品新政策16 CFR 1262详解

近日&#xff0c;亚马逊美国站公布磁铁产品&#xff08;不包括玩具&#xff09;的新政策更新公告&#xff0c;公告如下&#xff1a; 公告显示&#xff0c;由于美国消费品安全委员会&#xff08;US Consumer Product Safety Commission&#xff09;出台了新的安全规定&#xff…

海王算法(看完不会变成海王)

&#x1f4a7;学了海王算法会变成海王吗&#xff0c;它又能解决什么样的问题呢&#xff1f;&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 数据结构与算法专栏的文章图文…

内存池解释及线程池(Linux)实现

1.内存池1.什么是内存池内存池是一种内存分配方式。在真正使用内存之前&#xff0c;先申请分配一定数量的、大小相等的内存块留作备用。当有新的内存需求时&#xff0c;就从内存池中分出一部分内存块&#xff0c;若内存块不够再继续申请新的内存。使用内存池的优点有&#xff1…

Pyspark_SQL3

Pyspark 注&#xff1a;大家觉得博客好的话&#xff0c;别忘了点赞收藏呀&#xff0c;本人每周都会更新关于人工智能和大数据相关的内容&#xff0c;内容多为原创&#xff0c;Python Java Scala SQL 代码&#xff0c;CV NLP 推荐系统等&#xff0c;Spark Flink Kafka Hbase Hi…

会声会影2023新版本功能详情讲解

会声会影2023Corel VideoStudio一款功能丰富的视频编辑软件。会声会影2023简单易用&#xff0c;具有史无前例的强大功能&#xff0c;拖放式标题、转场、覆叠和滤镜&#xff0c;色彩分级、动态分屏视频和新增强的遮罩创建器&#xff0c;超越基本编辑&#xff0c;实现影院级效果。…
最新文章