java23种设计模式(二)-- 建造者模式和原型模式
一、建造者模式
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创造不同的表示。
特点:
(1)、在某些属性没有赋值之前,复杂对象不能作为一个完整的产品使用。比如汽车包括方向盘、车门、发动机等各部件,缺少了这些部件就不能生产使用。
(2)、对象的一些属性必须按照顺序赋值,比如汽车应有车架才能装车轮和其他部件。
建造者模式涉及到以下四个角色的概念:
- 抽象建造者角色:提供一个接口,规范产品对象的建造,一般由子类实现。一般来说,产品的组成部分数与建造方法数相同,即有多少组成部分,就有多少个建造方法。
- 具体建造者角色:该角色实现了抽象建造者抽象建造者接口,主要是实现所有声明的方法以及返回建造好的产品实例。
- 导演者角色:负责调用具体建造者按照顺序建造产品。导演者只负责调度,真正执行的是具体建造者角色。
- 产品角色:该角色是建造的复杂对象,提供基本方法。
具体实现
1、创建产品角色
public class Production {
private String part1;
private String part2;
public String getPart1() {
return part1;
}
public void setPart1(String part1) {
this.part1 = part1;
}
public String getPart2() {
return part2;
}
public void setPart2(String part2) {
this.part2 = part2;
}
@Override
public String toString() {
return "Production{" +
"part1='" + part1 + '\'' +
", part2='" + part2 + '\'' +
'}';
}
}
2、创建抽象建造者角色
public interface IBuilder {
//产品有多少个组件,就有多少个建造方法
void buildPart1();
void buildPart2();
//返回产品类
Production build();
}
3、创建具体建造者角色
public class BuilderA implements IBuilder{
private Production production = new Production() ;
@Override
public void buildPart1() {
System.out.println("兰博基尼建造第一部分");
this.production.setPart1("This is part1 of Lamborghini");
}
@Override
public void buildPart2() {
System.out.println("兰博基尼建造第二部分");
this.production.setPart2("This is part2 of Lamborghini");
}
@Override
public Production build() {
System.out.println("咔擦!兰博基尼已造好!");
return this.production;
}
}
4、创建导演者角色
public class Director {
private IBuilder builder;
public Director(IBuilder builder){
this.builder = builder;
}
/**
* 开始具体构造
*/
public Production construct(){
this.builder.buildPart1();
this.builder.buildPart2();
return this.builder.build();
}
}
5、客户端调用
public class Client {
public static void main(String[] args) {
//建造一个产品A
IBuilder builder = new BuilderA();
Director director = new Director(builder);
System.out.println(director.construct());
}
}
运行结果
兰博基尼建造第一部分
兰博基尼建造第二部分
咔擦!兰博基尼已造好!
Production{part1='This is part1 of Lamborghini', part2='This is part2 of Lamborghini'}
优点
1)降低代码耦合度。在建造者模式中,客户端不需要知道产品内部是如何实现的,我们只需得到产品的对象。并且使用导演者和建造者分离组装过程和组件具体构造过程,具有灵活的扩展性。
2)优秀的扩展性。具体建造者相互独立,方便扩展,符合开闭原则。
缺点
1)一定的使用范围限制。建造者模式的产品的组件基本相同,如果产品的差异性较大,建造者模式就不适用了。
跟工厂方法模式对比:建造者模式和工厂模式同样是创建一个产品,工厂模式就是一个方法,而建造者模式有多个方法,并且建造者模式是有顺序的执行方法。就是说建造者模式强调的是顺序,而工厂模式没有顺序一说。
二、原型模式
通过复制一个已存在对象来生成一个新对象,被复制的对象称为原型;
补充:
1、JAVA中Object的clone方法已经为什么提供了复制对象的实现,且该方法为本地方法,性能好,在需要大量复制对象的情况,使用clone创建对象比new效率高;
补充下深拷贝和浅拷贝,深拷贝是通过拷贝内存(包括引用的对象)实现对象的创建;浅拷贝不拷贝引用的对象,但拷贝了引用的值,如果类的成员属性中都是基本类型,不含对象,也是可以达到深拷贝的效果;深拷贝可以通过将对象序列化成字节流以及反序列化实现,浅拷贝直接调用clone即可;
2、使用原型模式创建对象是没有调用类的构造方法的;
java已经很好的支持原型模式了,使用很简便,如下类,实现了Cloneable接口,即成了一个原型;
(参考另一篇博客:java的clone方法)
package com.pichen.dp.creationalpattern.prototype;
public class Cell implements Cloneable{
private int cellId;
public int getCellId() {
return cellId;
}
public void setCellId(int cellId) {
this.cellId = cellId;
}
public Cell(int id) {
this.cellId = id;
}
@Override
public Object clone() throws CloneNotSupportedException
{
System.out.println("clone a cell obj.");
return (Cell) super.clone();
}
}
使用原型,复制10个拷贝:
package com.pichen.dp.creationalpattern.prototype;
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Cell prototypeCell = new Cell(888);
for(int i = 0; i < 10; i++){
Cell copyCell = (Cell) prototypeCell.clone();
System.out.println(copyCell.hashCode() + ":" + copyCell.getCellId());
}
}
}
java23种设计模式(二)-- 建造者模式和原型模式的更多相关文章
- java23种设计模式之四:建造者模式
在软件开发过程中有时需要创建一个复杂的对象,这个复杂对象通常由多个子部件按一定的步骤组合而成.例如:在新招收一个员工时,对个人信息对象的创建,在不同的阶段,需要个人信息的内容也不一样,姓名.性别.年龄 ...
- java23种设计模式—— 二、单例模式
源码在我的github和gitee中获取 介绍 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. ...
- java23种设计模式之十:责任链模式
最近在学习netty中发现其中用到了责任链模式,然后结合自己在写代码中遇到了大量写if...else的情况,决定学习一下责任链模式. 一.什么样的场景下会选择用责任链模式 我们在进行业务逻辑判断时,需 ...
- java23种设计模式(一)工厂方法模式
在说工厂方法模式之前,先了解一下简单工厂模式.工厂方法模式其实是在简单工厂上面做了一些增强. 简单工厂模式:有一个专门的类来生产其他类的实例,生产的这些实例有一个共同父类.这个跟我们的多态有一点像. ...
- java23种设计模式之九: 抽象工厂方法模式
一.抽象工厂定义 上一讲我们说了一下工厂方法,那么我们如何对工厂进行抽象. 因为工厂是生产产品的,现在我们需要工厂抽象,只生产抽象产品,不生产具体的产品,这同时也体现了java的多态. 现在有2个抽象 ...
- java23种设计模式——五、建造者模式
源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式- ...
- java23种设计模式——四、原型模式
源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式- ...
- java23种设计模式——八、组合模式
目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式--四.原型模式 java23种设计模式-- ...
- java23种设计模式——七、桥接模式
原文地址:https://www.cnblogs.com/chenssy/p/3317866.html 源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 j ...
- java23种设计模式—— 一、设计模式介绍
Java23种设计模式全解析 目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式--四.原型模 ...
随机推荐
- RPC_简洁版
1.定义服务接口 public interface RpcService { int printHello(int msg); } 2.定义服务接口实现类 public class RpcInterf ...
- [Luogu1821][USACO07FEB]银牛派对Silver Cow Party
由题意可知,我们需要求的是很多个点到同一个店的最短距离,然后再求同一个点到很多个点的最短距离. 对于后者我们很好解决,就是很经典的单源最短路径,跑一边dijkstra或者SPFA即可. 然而对于前者, ...
- 前端每日实战:72# 视频演示如何用纯 CSS 创作气泡填色的按钮特效
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/eKqZjy 可交互视频 此视频是可 ...
- [原创] Delphi InputBox、InputQuery函数
Delphi InputBox.InputQuery函数 两个函数都是弹框提示输入信息 function InputQuery(const ACaption, APrompt: string; var ...
- Vue的跨域设置
1.在使用vue开发的时候经常要涉及到跨域的问题,其实在vue cli中是有我们设置跨域请求的文件的. 2.当跨域无法请求的时候我们可以修改工程下config文件夹下的index.js中的dev:{} ...
- SQL Server DBA日常检查常用SQL
.数据库 --所有数据库的大小 exec sp_helpdb --所有数据库的状态 select name, user_access_desc, --用户访问模式 state_desc, --数据库状 ...
- paper 158:CNN(卷积神经网络):Dropout Layer
Dropout作用 在hinton的论文Improving neural networks by preventing coadaptation提出的,主要作用就是为了防止模型过拟合.当模型参数较多, ...
- ThinkPHP整合datatables实现服务端分页
最近做东西有一个需求,因为数据量很大,在这里我决定使用datatables的服务端分页,同时还需要传递查询条件到服务端.在网上搜索的大部分文章都感觉有些误差,于是自己封装了一下,主要配置/工具为: 服 ...
- NOIp 数据结构专题总结 (2):分块、树状数组、线段树
系列索引: NOIp 数据结构专题总结 (1) NOIp 数据结构专题总结 (2) 分块 阅:<「分块」数列分块入门 1-9 by hzwer> 树状数组 Binary Indexed T ...
- configure error C compiler cannot create executables错误解决
我们在编译软件的时候,是不是经常遇到下面的错误信息呢? checking build system type... i686-pc-linux-gnuchecking host system ty ...