设计模式之创建型汇总
设计模式
创建型
工厂方法模式
定义:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行
使用场景:
创建对象需要大量重复的代码
客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
一个类通过其子类来指定创建哪个对象
当明确地计划不同条件下创建不同实例时
优点:
用户只需关心所需产品对应的工厂,无须关心创建细节
加入新产品符合开闭原则,提高可扩展性
缺点:
类的个数容易过多,增加复杂度
增加了系统的抽象性和理解难度
注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
源码用处:
collection 类的 iterator
抽象工厂模式
定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类,工厂的工厂
使用场景:
系统的产品有多于一个的产品族,而系统只消费其中某一族的产品
客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现
优点:
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象
具体产品在应用层代码隔离,无须关心细节
将一个系列的产品族统一到一起创建
缺点:
产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码
增加了系统的抽象性和理解难度
注意事项:产品族难扩展,产品等级易扩展。
源码用处:
jdk:java.sql.connection、java.sql.statement
mybatis:SqlSessionFactory
建造者模式
定义:将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,用户只需指定需要建造的类型就可以得到它们,建造过程及细节不需要知道
使用场景:
如果一个对象有非常复杂的内部结构(很多属性),想把复杂对象的创建和使用分离。一些基本部件不会变,而其组合经常变化的时候。
优点:
易扩展,建造者独立,一定程度的解耦
封装性好,创建与使用相分离
便于控制细节风险
缺点:
产品必须有共同点,范围有限制
如内部过于复杂,会有很多的建造类
产品内部发生变化,建造者都要修改,成本较大
注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序
源码用处:
StringBuilder
mybatis里面的SqlSessionFactoryBuilder
单例模式
定义:保证一个类仅有一个实例,并提供一个全局的访问点
使用场景:
想确保任何情况下都绝对只有一个实例
当你想控制实例数目,节省系统资源的时候
优点:
在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
避免对资源的多重占用(比如写文件操作)
设置全局访问点,严格控制访问
缺点:
没有接口,不能继承
与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化
注意事项:私有构造器,线程安全,延迟加载,序列化和反序列化安全(需要在单例类里,添加readResolve()方法如:
private Object readResolve(){ return hungrySingleton;}
),反射Q(解决办法:在私有构造器里面,添加判断,抛出异常,如:
private LazySingleton(){ if(lazySingleton != null){ throw new RuntimeException("单例模式禁止反射调用"); }}
源码用处:
jdk1.8 的 Runtime类(饿汉式):private static Runtime currentRuntime = new Runtime();
jdk1.8 的 Desktop(容器式)
spring 中的 bean 的作用域 singleton
原型模式
定义:指定原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,不需要知道任何创建的细节,不调用构造函数
使用场景:
类初始化消耗较多的资源
new产生的一个对象需要非常繁琐的过程(数据备份、访问权限等)
构造函数比较复杂
循环体中产生大量的对象时
优点:
原型模式性能比直接new一个对象性能高
简化创建过程
缺点:
必须配备克隆方法
对克隆复杂对象或对克隆出的对象进行复杂改造时,容易引入风险
深拷贝、浅拷贝要运用得当
注意事项:
深克隆,浅克隆
在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 clone 的方法创建一个对象,然后由工厂方法提供给调用者。原型模式已经与 Java 融为浑然一体,大家可以随手拿来使用。
转载于:https://www.cnblogs.com/horken/p/10778426.html
设计模式之创建型汇总相关推荐
- java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...
23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...
- Java设计模式之创建型:原型模式
一.什么是原型模式: 原型模式主要用于对象的创建,使用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.UML类图如下: 原型模式的核心是就是原型类 Prototype,Prototype ...
- Java设计模式之创建型:建造者模式
一.什么是建造者模式: 建造者模式将复杂产品的创建步骤分解在在不同的方法中,使得创建过程更加清晰,从而更精确控制复杂对象的产生过程:通过隔离复杂对象的构建与使用,也就是将产品的创建与产品本身分离开来, ...
- Java设计模式之创建型:单例模式
一.什么是单例模式: 单例模式可以确保系统中某个类只有一个实例,该类自行实例化并向整个系统提供这个实例的公共访问点,除了该公共访问点,不能通过其他途径访问该实例.单例模式的优点在于: 系统中只存在一个 ...
- Java学习--设计模式之创建型模式
一.简介 创建型模式:这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象.这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活.创建型模式包括:工 ...
- php 长剑设计模式,PHP设计模式(创建型)
前言 随着编程项目经验的增加,从服务于业务逻辑到针对项目的全局设计.认识到设计模式在开发过程中 \的重要性,遵循 S.O.L.I.D 五大基准原则.它拓展了我的视野,让代码更加灵活,看起来更加富有美感 ...
- 备战面试日记(3.2) - (设计模式.23种设计模式之创建型模式)
本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.6 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...
- 设计模式之创建型模式(工厂、原型、建造者)
文章目录 创建型模式 2.1 工厂设计模式 2.1.1 简单工厂模式 2.1.2 工厂方法模式 2.1.3 抽象工厂 2.1.4 工厂模式总结 2.1.5 Spring中的工厂模式 2.1.6 工作中 ...
- GOF23设计模式(创建型模式)工厂模式
目录: 一:工厂模式的核心本质 二:关于面向对象的六大基本原则 三:工厂模式的三大类详解(代码示例,详细分析) 首先,上咱本GOF23所有工厂模式的分类表格!!! 创建型模式 单例模式.工厂模式.抽象 ...
最新文章
- 16个概念带你入门 Kubernetes
- 独家 | 一文读懂Corda分布式记账技术
- 使用Xpand XAF创建项目产生Quartz错误的解决方法
- CNN卷积层图像和矩阵转换函数
- 精算模型1 一元生存分析3 条件概率与截尾分布
- 阎焱多少身价_2020年,数据科学家的身价是多少?
- ASP.NET Core真实管道详解[1]
- hive mysql集群安装_HIVE完全分布式集群安装过程(元数据库: MySQL)
- php include path pear,关于php:pear include_path数据文件夹不再有效
- VMware vSphere功能特性比较 6.5 6.7 7.0
- MySQL和Oracle的一些区别
- t–sql pl–sql_SQL存储过程–终极指南
- 第 10 章 容器监控 - 080 - Weave Scope 容器地图
- 【网络】如何判断网络达到瓶颈
- 30万人追更,年度重磅Go图书出版,百万流量博主带你学习Go底层原理
- python set(集合) 与 and 、 | 与 or之间的区别
- 深度人工神经网络模拟单个皮层神经元1
- [效率提升]webstorm配置Prettier
- 计算机云计算论文范文,云计算环境下计算机管理系统论文
- 锐速ServerCheck序列号生成原理
热门文章
- 伦理困境:人工智能浪潮与“AI威胁论”之争
- Redis 笔记(12)— 单线程架构(非阻塞 IO、多路复用)和多个异步线程
- c语言中字符串数组的地址存放以及%s输出单个字符导致程序崩溃的问题
- LeetCode简单题之检查两个字符串数组是否相等
- TinyML-TVM如何驯服TinyML
- MinkowskiPooling池化(下)
- 2021年大数据Kafka(十一):❤️Kafka的消费者负载均衡机制和数据积压问题❤️
- 2021年大数据常用语言Scala(三):Scala解释器
- 2021年大数据Spark(十五):Spark Core的RDD常用算子
- Python案例:使用XPath的爬虫