设计模式之建造者和原型模式
balabala:这个可以按领域驱动设计来理解,每个实体有多个值对象,每个实体有一个实体类,多个值对象,一个抽象类,一个工厂类组成,这样做的原因是解耦合,有利于后期功能添加和维护。原型总的来说就是继承了Cloneable 接口重写了clone方法,后期创建相同对象时使用clone方法。
概述
建造者设计模式(Builder Pattern)属于创建型设计模式,主要用于创建复杂的对象,可将复杂对象的构建过程抽象出来,通过不同实现的构建者和装配者最终组装出不同的对象,可以非常方便的增加不同实现的构建者、组装者而不用修改以前的代码。
本质
建造者设计模式(Builder Pattern)分离了对象子组件的构造过程和组装过程,实现了构建与组装的解耦,不同的构建器相同的组装顺序以及相同的构建器不同的组装顺序都可以创建出不同的对象,使得构建与组装充分解耦,进而实现构建算法与组装算法的解耦,从而实现更好的复用。
关键概念
构建者(Builder):构建不同的子组件且返回子组件或者提供获取复杂对象的方法,将构建过程抽象成接口或抽象类,方便扩展具体的不同的构建者。组装者(Dirctor):通过某个具体的构建者构建相关的子组件,同时对外提供组成复杂产品对象的方法。
当需要生成复杂对象时,直接通过某个具体的组装者获得想要的具体对象即可,至于组装过程与构建过程使用者不需要关心,分别由具体的组装者与具体的构建者内部完成。当然复杂对象可以理解为具有很多属性的对象。
举个例子
package com.youngchan.test.practice.builder;
import com.youngchan.test.practice.builder.domain.Camera;
import com.youngchan.test.practice.builder.domain.Cpu;
import com.youngchan.test.practice.builder.domain.Screen;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;/*** @author youngchan* @version V1.0* @Package com.youngchan.test.practice.builder* @date 2020/6/9 14:35*/
@Data
@NoArgsConstructor
@ToString
public class Phone {/*** 屏幕*/private Screen screen;/*** 摄像头*/private Camera camera;/*** cpu*/private Cpu cpu;public Phone(Screen screen, Camera camera, Cpu cpu) {System.out.println("创建手机");this.screen = screen;this.camera = camera;this.cpu = cpu;}
}package com.youngchan.test.practice.builder.domain;
import lombok.Data;/*** @author youngchan* @version V1.0* @Package com.youngchan.test.practice.builder.domain* @date 2020/6/9 14:37*/
@Data
public class Camera {/*** 摄像头*/private String camera;public Camera(String camera) {System.out.println("创建摄像头");this.camera = camera;}
}package com.youngchan.test.practice.builder.domain;
import lombok.Data;/*** @author youngchan* @version V1.0* @Package com.youngchan.test.practice.builder.domain* @date 2020/6/9 14:38*/
@Data
public class Cpu {private String cpu;public Cpu(String cpu) {System.out.println("创建Cpu");this.cpu = cpu;}
}package com.youngchan.test.practice.builder.domain;
import lombok.Data;/*** @author youngchan* @version V1.0* @Package com.youngchan.test.practice.builder.domain* @date 2020/6/9 14:37*/
@Data
public class Screen {private String screen;public Screen(String screen) {System.out.println("创建显示屏");this.screen = screen;}
}package com.youngchan.test.practice.builder;
import com.youngchan.test.practice.builder.domain.Camera;
import com.youngchan.test.practice.builder.domain.Cpu;
import com.youngchan.test.practice.builder.domain.Screen;/*** 这个是构造组件接口* @author youngchan*/
public interface PhoneBuilder {Screen builderScreen();Camera builderCamera();Cpu builderCpu();
}
package com.youngchan.test.practice.builder;/*** 抽象的组装者* @author jzman*/
public interface PhoneDirector {Phone directPhone();
}package com.youngchan.test.practice.builder;
import com.youngchan.test.practice.builder.domain.Camera;
import com.youngchan.test.practice.builder.domain.Cpu;
import com.youngchan.test.practice.builder.domain.Screen;public class MiPhoneBuilder implements PhoneBuilder{@Overridepublic Screen builderScreen() {System.out.println("构建屏幕...");return new Screen("Mi-screen");}@Overridepublic Camera builderCamera() {System.out.println("构建相机...");return new Camera("Mi-camera");}@Overridepublic Cpu builderCpu() {System.out.println("构建CPU...");return new Cpu("Mi-cpu");}
}package com.youngchan.test.practice.builder;
public class MiPhoneDirector implements PhoneDirector{private PhoneBuilder builder;public MiPhoneDirector(PhoneBuilder builder) {this.builder = builder;}@Overridepublic Phone directPhone() {Phone phone = new Phone();phone.setScreen(builder.builderScreen());phone.setCamera(builder.builderCamera());phone.setCpu(builder.builderCpu());return phone;}
}package com.youngchan.test.practice.builder;
public class Client {public static void main(String[] args) {PhoneBuilder builder = new MiPhoneBuilder();MiPhoneDirector director = new MiPhoneDirector(builder);Phone phone = director.directPhone();System.out.println(phone);}
}
建造者设计模式(Builder Pattern) 一般用于具有共同特性的复杂对象,其对象本身与构建、组装过程分离,可做到复杂对象属性的可配置,当然,如果复杂对象内部过于复杂,势必会需要创建更多的构建者类,使得构建过程繁琐,我觉得开发中使用建造者设计模式主要用来做一些封装,使得代码写起来更灵活,如 Picasso、Glide 的 API 就有建造者设计模式的使用,使得复杂对象的一些属性可以做到可配置,非常方便。
原型模式
一、概述
原型模式(Prototype Pattern)用于创建重复的对象,同时又能保证性能。它属于创建型设计模式,它提供了一种创建对象的最佳方法。
这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。
二、介绍
意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
主要解决:在运行期建立和删除模型。
何时使用:
当一个系统应该独立于它的产品创建,构成和表示时。
当要实例化的类是在运行时指定时,例如,通过动态装载。
为了避免一个与产品类层次平行的工厂类层次时。
当一个类的实例只能有几个不同状态组合中的一种时。创建相应数目的原型并克隆它们可能比每次用何时的状态手工实例化该类更方便一些。
如何解决:利用已有的一个原型对象,快速地生成和原型对象一样的实例。
实现克隆操作,继承Cloneable,重写clone()方法。
原型模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些“易变类”拥有稳定的接口。
应用实例:细胞分裂;Object的clone()方法。
优点:性能提高;逃避构造函数的约束。
缺点:
配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。
必须实现Cloneable接口。
使用场景:
资源优化场景。
类初始化需要消耗非常多的资源,这个资源包括数据、硬件资源等。
性能和安全要求的场景。
通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。
一个对象多个修改者的场景。
一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。
在实际项目中,原型模式很少单独出现,一般是和工厂模式一起出现,通过clone方法创建一个对象,然后由工厂方法提供给调用者。
注意事项:与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。浅拷贝实现Cloneable,重写,深拷贝是通过实现Serializable读取二进制流。
三、实现
需要继承Cloneable 接口 重写clone方法
简单damo
import lombok.AllArgsConstructor;
import lombok.Data;/*** @author youngchan* @version V1.0* @Package com.youngchan.test.practice.prototypepattern* @date 2020/6/9 15:04*/
@Data
@AllArgsConstructor
public class PrototypePattern implements Comparable , Cloneable {private String id;@Overridepublic int compareTo(Object o) {return 0;}@Overrideprotected PrototypePattern clone() throws CloneNotSupportedException {return (PrototypePattern)super.clone();}
}
package com.youngchan.test.practice.prototypepattern;/*** @author youngchan*/
public class CreateProtype extends PrototypePattern{public CreateProtype(String id) {super(id);}
}
package com.youngchan.test.practice.prototypepattern;/*** @author youngchan*/
public class JavaDemo {public static void main(String[] args) throws CloneNotSupportedException {PrototypePattern p1 = new CreateProtype("1");PrototypePattern p2 = p1.clone();System.out.println(p1);System.out.println(p2);System.out.println(p1 == p2);}}
复杂damo: (总之就是使用copy方法创建相同对象节省空间)
实例来自:Java设计模式(四)之原型模式 - 简书
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、pandas是什么?
- 二、使用步骤
- 1.引入库
- 2.读入数据
- 总结
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、pandas是什么?
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
二、使用步骤
1.引入库
代码如下(示例):
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import warnings warnings.filterwarnings('ignore') import ssl ssl._create_default_https_context = ssl._create_unverified_context
2.读入数据
代码如下(示例):
data = pd.read_csv( 'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv') print(data.head())
该处使用的url网络请求的数据。
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
设计模式之建造者和原型模式相关推荐
- 设计模式学习系列6 原型模式(prototype)
原型模式(prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.允许一个对象再创建另外一个新对象的时候根本无需知道任何创建细节,只需要请求圆形对象的copy函数皆可. 1 ...
- 设计模式(四)——原型模式详解
设计模式(四)--原型模式详解 定义 结构 实现 案例 浅克隆 深克隆 定义 原型模式就是用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的对象. 结构 原型模式包含以下角色: ...
- 设计模式(5)原型模式(Prototype)
设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 设计模式(2)工厂方法模式(Factory Method) 设计模式(3)抽象工厂模式(Abstract Factory) 设 ...
- 大战设计模式【23】—— 原型模式
原型模式(Prototype) 设计模式使用的例子https://github.com/LinkinStars/DesignPatternsAllExample 一.定义 使用原型实例指定创建对象的种 ...
- 《游戏程序设计模式》 1.4 - 原型模式
为什么80%的码农都做不了架构师?>>> 我第一次听到"原型"这个词是在<设计模式>中.今天,好像每个人都在谈论这个词,但是结果并不是在谈论设计模式. ...
- 设计模式笔记五:原型模式
原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出 菜鸟教程讲的比较难懂,有篇简洁易懂的博客: http://blog.csdn.net/j ...
- 面向对象设计模式纵横谈:Prototype 原型模式(笔记记录)
有一段时间没写东西了,今天继续把没写完的设计模式写完,今天这堂课是创建型设计模式的最后一堂课,原型设计模式,它同样也是解决了对象在创建的过程中的解耦合的情况,面对变化使代码更稳定,更准确的说是使 ...
- 设计模式(六)原型模式
一.原型模式的作用? 1.基本就是你需要从A的实例得到一份与A内容相同,但是又互不干扰的实例的话,就需要使用原型模式. 2.用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.这个其实和C ...
- 设计模式【5】-- 原型模式
开局一张图,剩下全靠写- 设计模式文章集合:http://aphysia.cn/categories/designpattern 前言 接触过 Spring 或者 Springboot 的同学或许都了 ...
- 设计模式之禅【原型模式】
真刀实枪之原型模式 先发个个性化电子账单来引出今天的主角 个性化服务 一般银行都会要求个性化服务,添加一些个人信息在提示信息之前. 递送的成功率 邮件的递送成功率有一定的要求,由于大批的发送邮件,会被 ...
最新文章
- LeetCode简单题之至少是其他数字两倍的最大数
- 深入浅出Pytorch:02 PyTorch基础知识
- prometheus python client
- VS2012下基于Glut OpenGL GL_POLYGON示例程序:
- 3.26 Tensorflow 实验记录
- 基于opencv的摄像头脸部识别抓取及格式储存(python)
- 全链路压测原理篇(方案 概念 架构 实现)
- mhdd硬盘测试软件,mhdd硬盘检测工具使用攻略 mhdd硬盘检测工具如何使用
- 写给大家看的量子力学——量子通信、量子隐形传输技术简介
- 什么是反馈电路?反馈有什么作用?
- Unity优化——模型合并
- 海外短视频月活1.5亿,欢聚时代拿稳全球短视频入场券?
- PHP连接并使用人大金仓数据库kingbase
- appcrash事件怎么解决?三种方法教你
- 程序员如何预防颈椎病?
- js下载当前页面表格为excel
- subst 不小心创建出来虚拟磁盘 在磁盘管理中删不掉 使用subst命令删除 完美解决
- 解密通往元宇宙的三大入口,VR先上AR紧跟,但脑机接口才是未来
- mysql日期时间类型
- Arcgis正方形缓冲工具
热门文章
- 【盘点】2017杭州云栖大会迁云实战Workshop
- ubuntu安装synopsys dc报错
- Linux 查看与修改mtu值
- math.abs() java_Java中使用Math.abs你入坑了?
- w3wp ash oracle,巧妙使用ASH信息
- dojo的API功能介绍
- dojo 框架实战笔记
- 计算机演示文稿应用主题,使用屏幕阅读器在 PowerPoint 中创建演示文稿的基本任务...
- 大气科学领域必备的模型软件汇总丨WRF、WRF-CMAQ、WRF-Chem、WRF-Hydro、WRF DA、PMF、MCM、CAMx、SMOKE、CMIP6等
- 腾讯面试题, 2020年,让我们愉快的赛一次马!