构建器(builder)


描述:

将一个复杂对象的构建与其表示相分离,使得同样的构建过程(稳定)可以创建不同的表示(变化)。

builder 模式主要用于“分步骤构建一个复杂的对象”。在这其中 “分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化。

场景:

某游戏软件中人物角色包括多种类型,不同类型的人物角色,其性别、脸型、服装、发型等外部特征有所差异,使用建造者模式创建人物角色对象,请根据类图编程实现该系统,并写出相应Java代码

java代码

package org.crudboy;/** 人物类 **/
class Actor {private String type;private String sex;private String face;private String costume;private String hairstyle;public void setType(String type) {this.type=type;}public void setSex(String sex) {this.sex=sex;}public void setFace(String face) {this.face=face;}public void setCostume(String costume) {this.costume=costume;}public void setHairstyle(String hairstyle) {this.hairstyle=hairstyle;}public String toString() {return "Actor{" +"type='" + type + '\'' +", sex='" + sex + '\'' +", face='" + face + '\'' +", costume='" + costume + '\'' +", hairstyle='" + hairstyle + '\'' +'}';}
}abstract class ActorBuilder {protected Actor actor = new Actor();public abstract void buildType();public abstract void buildSex();public abstract void buildFace();public abstract void buildCostume();public abstract void buildHairstyle();public Actor createActor() {return actor;}
}class HeroBuilder extends ActorBuilder {public void buildType() {actor.setType("英雄");}public void buildSex() {actor.setSex("男");}public void buildFace() {actor.setFace("英俊");}public void buildCostume() {actor.setCostume("盔甲");}public void buildHairstyle() {actor.setHairstyle("飘逸");}
}class AngelBuilder extends ActorBuilder {public void buildType() {actor.setType("天使");}public void buildSex() {actor.setSex("女");}public void buildFace() {actor.setFace("漂亮");}public void buildCostume() {actor.setCostume("白裙");}public void buildHairstyle() {actor.setHairstyle("披肩长发");}
}class GhostBuilder extends ActorBuilder {public void buildType() {actor.setType("魔鬼");}public void buildSex() {actor.setSex("妖");}public void buildFace() {actor.setFace("丑陋");}public void buildCostume() {actor.setCostume("黑衣");}public void buildHairstyle() {actor.setHairstyle("光头");}
}class ActorController {static public Actor construct(ActorBuilder ab) {ab.buildType();ab.buildSex();ab.buildFace();ab.buildCostume();ab.buildHairstyle();return ab.createActor();}
}public class Builder {public static void main(String[] args) {Actor actor = ActorController.construct(new AngelBuilder());System.out.println(actor);}
}

看完了代码,那么如何理解”相同的构建过程(稳定)可以创建不同的表示(变化)
呢?

在抽象的Builder类中指定了构造对象的各个步骤,而在Controller类中指定步骤执行顺序,后面也不会再做改变(稳定)。

而每个步骤的具体实现则可由具体实现类来决定(变换)。

看起来是不是有点像模板方法(template method)?我个人理解是构建器模式侧重点于对象的创建过程,而模板方法则比较广泛。

原型(prototype)


描述:

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

场景:

在某OA系统中,用户可以创建工作周报,由于某些岗位每周工作存在重复性,因此可以通过复制原有工作周报并进行局部修改来快速创建工作周报,现使用原型模式来实现该功能,请根据类图编程实现该系统,并写出相应Java代码。

java代码

package org.crudboy;class WeeklyLog implements Cloneable
{private String name;private String date;private String content;public void setName(String name) {this.name = name;}public void setDate(String date) {this.date = date;}public void setContent(String content) {this.content = content;}@Overridepublic String toString() {return "WeeklyLog{" +"name='" + name + '\'' +", date='" + date + '\'' +", content='" + content + '\'' +'}';}public WeeklyLog clone() {try {WeeklyLog clone = (WeeklyLog) super.clone();return clone;} catch (CloneNotSupportedException e) {throw new AssertionError();}}
}public class Prototype {public static void main(String[] args) {WeeklyLog logOfWeek1 = new WeeklyLog();logOfWeek1.setName("wincing");logOfWeek1.setDate("2022-week1");logOfWeek1.setContent("do work");System.out.println(logOfWeek1);WeeklyLog logOfWeek2 = logOfWeek1.clone();logOfWeek2.setDate("2022-week2");System.out.println(logOfWeek2);}
}

原型模式比较简单,我们日常写代码就会有这种场景:对于某段shit mountain,我们会用CV大法并在原基础上修改一些参数之类。其实这正是prototype的思想。

(二)设计模式——构建器,原型模式相关推荐

  1. C++编程思想 第2卷 第10章 设计模式 构建器模式:创建复杂对象

    构建器 Builder 模式的模板是将对象的创建与它的 表示法 分开 意味着 创建保持原状  但是产生对象 的表示法 不同 作为模型的自行车按照其内心来选择零部件组装一辆自行车 一个构建器与每个自行车 ...

  2. Java描述设计模式(05):原型模式

    一.原型模式简介 1.基础概念 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. 2.模式结构 原型模式要求对象实现一个 ...

  3. 【Builder模式】C++设计模式——构建器

    构建器 一.设计流程介绍 二.模式介绍 三.代码实现     C++设计模式大全,23种设计模式合集详解-

  4. javascript设计模式与开发实践(二)- 封装和原型模式

    封装 封装数据 在许多语言的对象系统中,封装数据是由语法解析来实现的,这些语言也许提供了 private. public.protected 等关键字来提供不同的访问权限.例如:java 但在js里面 ...

  5. c++设计模式--构建器(builder pattern)

    一.原理讲解 1.1意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 1.2应用场景 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时: 当构造过程必 ...

  6. 设计模式学习笔记-原型模式

    一.概述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象: 二.模式中的角色 Prototype:声明一个克隆自身的接口: ConcretePrototype:实现一个克隆自身的操作: ...

  7. 设计模式之九原型模式

    问题描述 在开发中你也许遇到过大篇幅的使用get或set赋值的场景,例如: public void setParam(ExamPaperVo vo){ExamPaper examPaper = new ...

  8. 设计模式之【原型模式】,深入理解深拷贝与浅拷贝

    文章目录 一.什么是原型模式 二.原型模式实现方式 1.传统方式 2.原型模式 熟悉浅拷贝和深拷贝 浅拷贝实现对象克隆 深拷贝实现对象克隆 一.什么是原型模式 原型模式: 用一个已经创建的实例作为原型 ...

  9. 【设计模式自习室】原型模式

    前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该设计模式的详细介绍,包括: 引子,意图(大白话解释) 类图,时序图(理论规范) 该模式的代码示例: ...

最新文章

  1. mybatis学习笔记(7)-输出映射
  2. c语言股票最大收益_金斧子股票配资:股票配资的时候有哪些事项需要注意呢...
  3. JAVA实现拼图游戏
  4. java命令行选项6_6.jdk命令行工具
  5. python 网页爬取数据生成文字云图
  6. c#: 协变和逆变深度解析
  7. LeetCode 1317. 将整数转换为两个无零整数的和
  8. C语言实现辗转相除法计算两数最大公约数
  9. OpenCV-数字图像处理之中值滤波
  10. tf.truncated_normal与tf.random_normal的区别
  11. Python案例篇:爬取分析大型招聘网站Python岗
  12. 数据库用户管理(增删改查,即CRUD)
  13. QT_继承ApplicationWindow控件的C++与QML交互
  14. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_17_常用的函数式接口_Function接口中的方法andThen...
  15. 开机自启动并关闭窗口(向日葵简约版)
  16. Xposed框架未安装解决方法
  17. 《机器学习算法竞赛实战》学习笔记1.竞赛简介
  18. 其他 - 所有中文字 附 拼音
  19. chrome浏览器升级导致无法手动设置cookie,设置无法保存
  20. 基地树洞 | 自动化小系列之番外篇

热门文章

  1. 十月二十五日西施沟溯溪
  2. 基于51单片机自动抄表系统
  3. ceil、lcase函数
  4. Numpy学习——大作业
  5. Python深度学习企业实战之TensorFlow的底层原理及安装
  6. Thunderhead Engineering PyroSim 2015.2.0604 Win64 1CD火灾消防动态模拟
  7. 2008服务器支持mp4,关于Windows2008服务器设置MIME后仍然无法播放MP4的解决方法
  8. python常用接收输入方式
  9. 计算机学院学生会工作总结,关于大学学生会的工作总结范文
  10. 音乐也社交:多米音乐App 5.0版更新,新添歌单功能,把UGC引入社区中