Android重拾设计模式——生成器模式
个人博客CoorChice,https://chenbingx.github.io/ ,最新文章将会首发CoorChice的博客,欢迎探索哦 !
同时,搜索微信公众号CoorChice
,或扫描文章末尾二维码,可以关注我的微信公众号。同期文章也将会优先推送到微信公众号中,以提醒您有新鲜文章出炉。
定义及实质
- 定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
- 实质
分离整体构建算法和部件构造。
解释:
打魔兽的时候,玩家就相当于Director指导者,兵营就相当于Builder生成器,而Product产品就是各种兵。玩家指导兵营生产不同的兵种,玩家可以通过自己的一些思考(构建算法)决定什么兵生产几个,开始或终止生产,而兵营只负责去构建这些兵种,并且对玩家暴露驱动生产的接口。
模式图解
生成器模式UML图
从上图可以看出:
- Director指导者,它拥有Builder构建者,负责实现构建算法,在适合的时候调用Builder创建部件或产品,并且具备配置Builder参数的能力,以便能够动态的创建符合要求的部件或产品;
- Builder构建者能够根据参数实现具体固定的构建过程,ConcreteBuilder实现了一种具体的构建过程;
- Product产品接口(不是必要的,在简化的生成器模式中Builder作为静态内部类存在于Product中)。
Talk is cheap, show me the Code.
//Director public class Director{ private Builder builder; //Director指导者需要持有Builder构建者 public Director(Builder builder){ this.builder = builder; } public void construct(){ builder.build(); } } //Builder public interface Builder{ void build(); } //ConcreteBuilder public class ConcreteBuilder implements Builder{ private Product resultProduct; private String property; public ConcreteBuilder(){ } public Product build(){ this.resultProduct = new ProductA(); resultProduct.setProperty(property); return resultProduct; } public Product setProperty(String property){ this.property = property; } public Product getResult(){ return resultProduct; } } //Product接口 public interface Product{ } public class ProductA{ private String property; public void setProperty(String property){ this.property = property; } }
看看Client客户端如何使用:
public class Client{ publuc static void main(Stringp[] args){ Product product; Builder builder = new ConcreteBuilder(); //创建生成器 buidler.setProperty("property"); Director director = new Director(builder); //创建指导者 director.construct(); //构建产品 product = builder.getResult(); //获得产品实例 } }
- 构建器模式可以省略Director,直接把Builder作为静态内部类嵌入到产品类中,然后把构建算法放到Client中。
public class Product{ private String property1; private String property2; private String property3; private Product(){ } private void setProperty1(String property1){ //可在这里对参数进行检查,如: if(property1.equals("condition1")){ System.out.println("property1 is error.") } this.property1 = property1; } private void setProperty2(String property2){ this.property2 = property2; } private void setProperty3(String property3){ this.property3 = property3; } public static class Builder{ private String property1; private String property2; private String property3; public Builder setProperty1(String property1){ this.property1 = property1; return this; } public Builder setProperty2(String property2){ this.property2 = property2; return this; } public Builder setProperty3(String property3){ this.property3 = property3; return this; } public Buidler build(){ //配置好属性之后,最终调用这个方法来创建对象 //也可在这里对参数进行检查,如: if(property1.equals("condition1")){ System.out.println("property1 is error.") } if(property2.equals("condition2")){ System.out.println("property2 is error.") } if(property3.equals("condition3")){ System.out.println("property3 is error.") } //创建Product Product product = new Product(); product.setProperty1(property1); product.setProperty2(property2); product.setProperty2(property2); return product; } } }
生成器模式顺序图
结合上面代码来看这个图。
模式优缺点
优势
- 松散耦合:将构建算法和构建过程分离,同时也与客户端隔离;
- 方便修改:由于松散耦合,依赖抽象,所以修改很容易进行;
- 复用性更好。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android重拾设计模式系列——外观模式
个人博客CoorChice,https://chenbingx.github.io/ ,最新文章将会首发CoorChice的博客,欢迎探索哦 ! 同时,搜索微信公众号CoorChice,或扫描文章末尾二维码,可以关注我的微信公众号。同期文章也将会优先推送到微信公众号中,以提醒您有新鲜文章出炉。 封面-设计模式.png 定义及实质 定义 为子系统中的一组接口提供一个一致的界面,这个界面使得子系统更加容易使用。 解释:英雄吹响号角(相当于统一界面,用于发动攻击),命令部队对敌军发动攻击;接下来部队里的各种兵种开始对敌军发动攻击。咕噜兵发起了攻击,狼骑发起了攻击,牛头人发起了攻击,风骑士发起了攻击...号角这个统一界面,把部队发起攻击的事件进行了封装,使得英雄不用去了解发起攻击时,部队中的每个兵种是如何发起攻击的。 实质 封装交互,简化调用。 模式图解 外观模式UML图 外观模式UML图 从上图可以看出: Facade作为外观类,它提供一个test() 方法入口,供CLient客户端调用子系统功能; 可以看到Facade依赖了子系统中所有类,因为它要负责调度它们;Facade其实就是把子系统...
- 下一篇
Android自定义View探索(三)—事件分发机制与滑动冲突处理
View的事件分发机制,其实就是对MotionEvent事件的分发机制,即当一个MotionEvent产生了以后,系统需要把这个事件传递给一个具体的View,这个传递的过程就是分发过程。 一.View的事件分发机制 整体流程: dispatchTouchEvent()—>onTouch()—>onTouchEvent()—>onClick() dispatchTouchEvent():View事件分发的入口,返回值表示MotionEvent是否被消费。 onTouch():View需要处理事件时,如果它设置了onTouchListener,那么onTouchListener中的onTouch方法会被调用。如果onTouch方法返回false,那么View的onTouchEvent()方法会被调用;如果onTouch方法返回true,那么View的onTouchEvent()方法将不会被调用。onTouch()的优先级比onTouchEvent()的优先级更高。 onTouchEvent():View自身对于Touch处理的实现 ,返回结果表示是否消耗当前事件。 onC...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS关闭SELinux安全模块
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长