建造者模式 生成器模式 创建型 设计模式(五)
从抽象工厂演化
示例
代码
package builder; public interface MainBoard { String desc(); }
package builder; public class DellMainBoard implements MainBoard { @Override public String desc() { return "DELL mainBoard"; } }
package builder; public class AsusMainBoard implements MainBoard { @Override public String desc() { return "ASUS mainBoard"; } }
package builder; public interface DisplayDevice { String Desc(); }
package builder; public class DellDisplayDevice implements DisplayDevice { @Override public String Desc() { return "DELL display device"; } }
package builder; public class AsusDisplayDevice implements DisplayDevice { @Override public String Desc() { return "ASUS display device"; } }
package builder; public interface Creator { MainBoard createMainBoard(); DisplayDevice createDisplayDevice(); }
package builder; public class ConcreateCreatorDell implements Creator { @Override public MainBoard createMainBoard() { return new DellMainBoard(); } @Override public DisplayDevice createDisplayDevice() { return new DellDisplayDevice(); } }
package builder; public class ConcreateCreatorAsus implements Creator { @Override public MainBoard createMainBoard() { return new AsusMainBoard(); }@Override public DisplayDevice createDisplayDevice() { return new AsusDisplayDevice(); } }
package builder; public class Computer { private MainBoard mainBoard; private DisplayDevice displayDevice; public MainBoard getMainBoard() { return mainBoard; }public void setMainBoard(MainBoard mainBoard) { this.mainBoard = mainBoard; }public DisplayDevice getDisplayDevice() { return displayDevice; }public void setDisplayDevice(DisplayDevice displayDevice) { this.displayDevice = displayDevice; }@Override public String toString() { final StringBuilder sb = new StringBuilder("Computer{"); sb.append("mainBoard=").append(mainBoard.desc()); sb.append(", displayDevice=").append(displayDevice.Desc()); sb.append('}'); return sb.toString(); } }
抽象工厂的问题
package builder; public class AssembleComputer { Creator creator; AssembleComputer(Creator creator){ this.creator = creator; }public Computer getComputer(){ Computer computer = new Computer(); MainBoard mainBoard = creator.createMainBoard(); DisplayDevice displayDevice = creator.createDisplayDevice(); computer.setMainBoard(mainBoard); computer.setDisplayDevice(displayDevice); return computer; } }
封装下的重构
package builder;public interface CreatorRefactor { void assembleMainBoard(); void assembleDisplayDevice(); Computer getComputer(); }
package builder; public class ConcreateCreatorDellRefactor implements CreatorRefactor { private Computer computer = new Computer(); @Override public void assembleMainBoard() { computer.setMainBoard(new DellMainBoard()); } @Override public void assembleDisplayDevice() { computer.setDisplayDevice(new DellDisplayDevice()); } @Override public Computer getComputer() { return computer; } }
package builder; public class ConcreateCreatorAsusRefactor implements CreatorRefactor { private Computer computer = new Computer(); @Override public void assembleMainBoard() { computer.setMainBoard(new AsusMainBoard()); } @Override public void assembleDisplayDevice() { computer.setDisplayDevice(new AsusDisplayDevice()); } @Override public Computer getComputer() { return computer; } }
package builder; public class AssembleComputerRefactor { CreatorRefactor creatorRefactor; AssembleComputerRefactor(CreatorRefactor creatorRefactor){ this.creatorRefactor = creatorRefactor; }public Computer getComputer(){ creatorRefactor.assembleMainBoard(); creatorRefactor.assembleDisplayDevice(); return creatorRefactor.getComputer(); } }
小结
意图
结构
给出一个抽象接口,以规范产品对象各个组成部分之间的构造
这个抽象的接口给出来构造一个产品的所有步骤以及最终产品的获取协议(就是其中定义的方法)(上面示例中的CreatorRefactor)
指挥产品的整个建造过程,不涉及具体产品的细节,只关注抽象建造者角色Builder定义的各个步骤的组织安排
代码示例
package buildPattern; public interface Builder { void buildPart1(); void buildPart2(); Product buildProduct(); }
package buildPattern;public class ConcreateBuilder implements Builder { private Product product = new Product();@Override public void buildPart1() { //... }@Override public void buildPart2() { //... }@Override public Product buildProduct() { return product; } }
package buildPattern; public class Product { }
package buildPattern;public class Director {private Builder builder;Director(Builder builder) {
this.builder = builder;
}public Product getProduct() {
builder.buildPart1();
builder.buildPart2();
return builder.buildProduct();
}
}
注意事项
与抽象工厂对比
使用场景
简化形式
建造者与构造方法
package simplebuilder;/** * Created by noteless on 2018/10/17. * Description:假定有一个MyObject类,有7个属性前面两个v1 和 v2 是必选,其余可选 * * @author noteless */ public class MyObject {private int v1;//必选 private int v2;//必选 private int v3;//可选 private int v4;//可选 private int v5;//可选 private int v6;//可选 private int v7;//可选private static class Builder {private int v1; private int v2;private int v3 = 0; private int v4 = 0; private int v5 = 0; private int v6 = 0; private int v7 = 0;public Builder(int v1, int v2) { this.v1 = v1; this.v2 = v2; }public Builder setV3(int v3) { this.v3 = v3; return this; }public Builder setV4(int v4) { this.v4 = v4; return this; }public Builder setV5(int v5) { this.v5 = v5; return this; }public Builder setV6(int v6) { this.v6 = v6; return this; }public Builder setV7(int v7) { this.v7 = v7; return this; }public MyObject build() { return new MyObject(this); } }private MyObject(Builder builder) { v1 = builder.v1; v2 = builder.v2; v3 = builder.v3; v4 = builder.v4; v5 = builder.v5; v6 = builder.v6; v7 = builder.v7; }@Override public String toString() { final StringBuilder sb = new StringBuilder("MyObject{"); sb.append("v1=").append(v1); sb.append(", v2=").append(v2); sb.append(", v3=").append(v3); sb.append(", v4=").append(v4); sb.append(", v5=").append(v5); sb.append(", v6=").append(v6); sb.append(", v7=").append(v7); sb.append('}'); return sb.toString(); }public static void main(String[] args) {MyObject my = new MyObject.Builder(1, 2). setV3(3).setV4(4).setV5(5).setV6(6).setV7(7).build(); System.out.println(my.toString()); } }
public MyObject build() {
return new MyObject(this);
}
总结
转载于:https://www.cnblogs.com/noteless/p/9958668.html
建造者模式 生成器模式 创建型 设计模式(五)相关推荐
- Java创建型设计模式——建造者模式
文章目录 1.0概念理解 2.0编码理解 2.1编码说明 2.2编码实现 五种创建型设计模式:工厂方法模式.抽象工厂模式.建造者模式.原型模式.单例模式 1.0概念理解 一句话理解:建造者模式 ...
- 设计模式----创建型设计模式(单例模式、工厂方法模式、构建者模式)
创建型设计模式 单例模式(Singleton Pattern) 单例模式介绍 代码演示 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全, ...
- android 工厂模式创建,7、Android设计模式---(创建型设计模式)抽象工厂模式
一.介绍,定义 抽象工厂模式也是创建型模式之一,抽象工厂模式起源于对不同操作系统的图形化解决方案,如不同操作系统的按钮和文本框控件及其实现. 为创建一组相关或者相互依赖的对象提供接口,而不需要具体指定 ...
- 创建型设计模式-----原型模式(浅克隆、深克隆)
目录 简介 为什么用克隆 浅克隆 深克隆 序列化实现深拷贝 应用场景 今天讲创建型设计模式中的原型模式,大家可以从标题中略微猜测一下,这个原型模式是个什么东东. 简介 定义:用原型实例创建对象的种类, ...
- 创建型设计模式——原型模式
1.思考问题 现在有一只羊 tom,姓名为: tom,年龄为:1,颜色为:白色,请编写程序创建和 tom羊属性完全相同的10只羊. 按照传统的思路来,我们可能会按照下面的方式去写. 那么这种写法的优缺 ...
- 二、java设计模式之工厂方法+抽象工厂模式(创建型设计模式)
创建型设计模式-工厂模式和应用 工厂模式介绍: 它提供了一种创建对象的最佳方式,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象 例子: 需要购买一辆车,不用管 ...
- 创建型设计模式之工厂模式
文章目录 一.工厂设计模式 二.工厂设计模式详解 1.简单工厂模式 2. 工厂方法模式 3. 抽象工厂模式 总结 一.工厂设计模式 工厂模式就类比实际生活中的工厂,在实际生活中,用户从来不会关系一个物 ...
- 模板方法模式 Template method 行为型 设计模式(二十六)
模板方法模式 Template method 上图为网上百度的一份简历模板截图 相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为你的 ...
- 设计模式--创建型设计模式
一. 设计模式的目的 编写软件过程中,可能面临来自耦合性.内聚性.可维护性.可扩展性.重用性.灵活性等多方面的挑战,设计模式是为了让程序具有更好的: 代码重用性(即相同的代码,不用多次编写) 可读 ...
最新文章
- 深度学习100例-卷积神经网络(CNN)彩色图片分类 | 第2天
- java 1_java基本语法1
- 2017 ICPC西安区域赛 A - XOR ,线段树合并线性基
- Notepad++ 配合TCC直接编译运行C代码
- python中for循环格式_如何将python中for循环的输出写入csv格式的文件?
- 第四季-专题2-U-Boot新手入门
- lesson 038 —— re 模块
- 基于BP神经网络的数字识别
- RH850中断使用方法
- ubantu无法连接外网的解决方法
- 编织机上下料西门子S71200PLC和KTP700触摸屏程序博途
- [技巧]WIN10笔记本生成电池损耗报表,与笔记本电池损耗恢复方法
- 4月6日----4月10日二年级课程表
- 计算机不识别固态硬盘,win7系统电脑无法识别M.2固态硬盘如何解决
- 普通用户申请微软的OneDrive免费网盘,容量5T、5T、5T,重要事情说三遍!!!!!
- vue移动端用什么数据可视化插件_前端必看的数据可视化入门指南
- AG9311/AG9310 Type-C转HDMI设计方案|替代AG9310/AG9311芯片|GSV2201可完全替代兼容AG9310/AG9311
- idc具体是啥 idc服务器是什么意思?
- Vue联动下拉框默认选中
- 哈工大软件构造lab1
热门文章
- [转载] java简易爬虫Crawler
- Tomcat报错:ERROR:transport error 202: gethostbyname: unknown host
- App 更换应用图标
- golang语言os.Stat()用法及功能
- WordPress学习笔记(三)其他功能
- 895计算机专业基础,2017北京工业大学895计算机学科专业基础考研入学考试大纲...
- cad 打开硬件加速卡_CAD运行用加速技巧
- python吧_如何自学Python?【python吧】
- Linux内存管理的设计与实现,Linux内核设计与实现-内存管理学习小结
- pandas用均值填充nan_如何填补Pandas中的缺失值(机器学习入门篇)