设计模式:工厂模式和建造者模式
工厂模式和建造者模式都是创建型模式,说白了都是为了创建对象为目标用途的设计模式。肯定会拿来比较,一般来说肯定是工厂模式更易懂,使用在平时的项目中更顺手。而建造者模式,更多是创建一个对象,要给这个对象给定一些参数来。有时候甚至感觉传统的建造者模式,有时候特别像工厂模式,因为有时候我们会给建造者抽象类定义几个“模板”,这几个模板特别像工厂模式里面的。所以有时候有点二者区分不开。
这里我们首先看一下基本的传统的建造者模式的结构:
这里面我有一个建造者模式的demo:
建造者模式demo
大体上我们可以区分为四部分:
- Product: 最终要生成的对象,例如 Computer实例。
- Builder:
构建者的抽象基类(有时会使用接口代替)。其定义了构建Product的抽象步骤,其实体类需要实现这些步骤。其会包含一个用来返回最终产品的方法Product
getProduct()。 - ConcreteBuilder: Builder的实现类。
- Director: 决定如何构建最终产品的算法. 其会包含一个负责组装的方法void Construct(Builder
builder), 在这个方法中通过调用builder的方法,就可以设置builder,等设置完成后,就可以通过builder的
getProduct() 方法获得最终的产品。
实际上在我们实现Builder基类时,实现了几个不同的ConcreateBuilder,实际上我认为时将工厂模式融合到里面了,为什么这样认为。我后面会说。
但是这种方式特别像我们常看到的一些比较肤浅的关于设计模式的文章,我们通过去记结构去记名字,实际上区分不出来什么,因为设计模式很多结构差不多,而且实际中最佳范例或者源码里面也不会标出这些,命名不规范这些。
尽信书不如无书。
实际上建造模式我认为最好的方式是内部类这种。
关于常规的建造者模式的内部类改造
对比工厂模式和建造者模式
相同点:创建型设计模式,目的相同,创建对象
不同点:工厂模式时是制式创建设计模式,哪怕你有一百个实现类,创建出来也就一百个类型。建造者模式,是自定义的模式,也许我就一个实现类ConcreateBuilder,但是里面参数我自己往里面塞,我可以理论上有无数种类型的。(通俗一点说,一个时制式化,一个是客制化)。
最后是一个我改写的内部类建造者模式demo。你可以尝试看看,传统的四部分是怎么在内部类改造中体现的,以及对比和传统的建造者模式的优势。
package com.example.test.builder.innerClass;/*** @Author: zhangpeng* @Description:* @Date: 2022/10/8*/
public class InnerComputerBuilder {private String cpu;//必须private String ram;//必须private int usbCount;//可选private String keyboard;//可选private String display;//可选public static class Builder{//必须private String cpu;private String ram;//可选private int usbCount;private String keyboard;private String display;public Builder( String cpu,String ram){this.cpu = cpu;this.ram = ram;}public Builder usbCount(int usbCount){this.usbCount = usbCount;return this;}public Builder keyBoard(String keyboard){this.keyboard = keyboard;return this;}public Builder display(String display){this.display = display;return this;}public InnerComputerBuilder build(){return new InnerComputerBuilder(this);}}private InnerComputerBuilder(Builder builder){cpu = builder.cpu;ram = builder.ram;usbCount = builder.usbCount;}public static void main(String[] args) {InnerComputerBuilder computerDirector = new InnerComputerBuilder.Builder("12400","16G").usbCount(3).keyBoard("84").display("24").build();}
}
设计模式:工厂模式和建造者模式相关推荐
- 23种设计模式之单例模式、工厂模式、原型模式、建造者模式
系列文章目录 第一章:程序设计原则-单一职责.接口隔离.依赖倒置.里式替换 第二章:程序设计原则-开闭原则.迪米特法则.合成复用原则 文章目录 系列文章目录 一.设计模式简单介绍 1.1.什么是设计模 ...
- 设计模式之---工厂模式、建造者模式
☺ 对于工厂模式,个人学习需要掌握 注意答案的重点标黑了.对于工厂模式.建造者模式,掌握,我下面这几点就很棒棒. 一.工厂模式 1.什么是工厂模式:[关键字factory] 答:创建对象时,不直接ne ...
- 北风设计模式课程---7、建造者模式
北风设计模式课程---7.建造者模式 一.总结 一句话总结: 设计模式都是对生活中好的做事方法的一些抽象,使得各司其职,减少出错. 建造者模式可以看做模仿的生活中:设计师,施工队做复杂房子交给客户的场 ...
- 设计模式(4)建造者模式/生成器模式(Builder)
设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 设计模式(2)工厂方法模式(Factory Method) 设计模式(3)抽象工厂模式(Abstract Factory) 源 ...
- 设计模式(五)——建造者模式
设计模式(五)--建造者模式 一.建造者模式简介 1.建造者模式简介 建造者模式将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式和抽象工厂模式在功能上很相似,都是用来 ...
- 工厂模式与建造者模式
工厂模式和建造者模式都属于创建型模式,它对类的实例化进行了抽象,能够使软件模块做到与对象的创建和组织无关. 简单工厂模式 专门定义一个类来负责创建其他类的实例,通常根据自变量的不同而返回不同的类的实例 ...
- Android设计模式(一)—— 建造者模式
其实设计模式,只是一种定式,适用于不同的语音,今天,虽然加上了Andorid的前缀,只是因为举例仅是android代码,所以学好内在,则举例仅是举例,内涵才是到处通用的. 建造者模式解释: ...
- 肝一肝设计模式【四】-- 建造者模式
系列文章目录 肝一肝设计模式[一]-- 单例模式 传送门 肝一肝设计模式[二]-- 工厂模式 传送门 肝一肝设计模式[三]-- 原型模式 传送门 肝一肝设计模式[四]-- 建造者模式 传送门 肝一肝设 ...
- 从王者荣耀看设计模式(十五.建造者模式)
从王者荣耀看设计模式(建造者模式) 一.简介 为了玩王者荣耀的游戏体验感,不少玩家都会选择花钱购买自己常用英雄的皮肤.一方面,购买的皮肤通常要比原画更加"炫酷".另一方面,购买的英 ...
最新文章
- Integer to Roman 问题
- PHP 将二叉查找树转换为双向链表,要求不能创建新节点,只能调节节点指针
- 区块链开发_以太坊多重签名
- C#.NET中的base关键字在派生类里的应用
- openshift使用_OpenShift v3:使用WildFly和MySQL的Java EE 7入门
- log4j mysql_log4j写入mysql数据库 | 学步园
- 织梦(安装,模板,基本标签)
- 《Algorithms》Java 语言特性
- Android:Eclipse+ADT+Android SDK 搭建安卓开发环境
- Cocos2d-x场景(Scene)详解
- linux 实验 广技师 进程管理与系统监视,实验9 linux进程管理与系统监视.doc
- 【运量预测】基于matlab BP神经网络公路运量预测【含Matlab源码 413期】
- Windows系统备份方法解答
- 两台路由器的连接方法和无线路由桥接
- Palm 与 webOS 之死
- 装linux系统的工具箱,PE,Dos工具箱,自动安装linux的U盘制作
- C# Behavior Tree -- 行为树
- 音乐播放器(vip在线听下载等等)~~正常运行
- Pyramid of Glasses
- 速卖通平台的未来在于走品牌化道路