Builder模式
来源:互联网 发布:dsp算法大全c语言 pdf 编辑:程序博客网 时间:2024/05/16 11:20
Builder模式定义
- 将一个复制对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。(抽象拗口)
Builder模式的使用场景
相同的方法,不同的执行顺序,产生不同的事件结果
当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值
多个布局或零件,都可以装配到一个对象中,但是产生的运行结构又不相同
简化的Builder模式
用一个内部类实现类的创建,链式调用,根据你的需要创建出来对象。
public class User { private String name; private String id; private User() {} private User(String name) { this.name = name; } private User(String name, String id) { this.name = name; this.id = id; } private String getName() { return name; } private void setName(String name) { this.name = name; } private String getId() { return id; } private void setId(String id) { this.id = id; } @Override public String toString() { // TODO Auto-generated method stub return String.format("[name: %s, id: %s]",name,id); } //内部类 public static class Builder { private User user = new User(); public Builder() { } public Builder setName(String name) { user.setName(name); return this; } public Builder setId(String id) { user.setId(id); return this; } public User build() { return user; } }}//测试public static void main(String[] args) { User.Builder builder = new User.Builder(); User user = null; user = builder.setName("lise") .setId("11").build();//链式调用 System.out.println(user.toString());}
经典Builder模式
UML类图
Product:产品抽象类
Builder:抽象Builder类,规范产品组建,一般是由子类实现
ConcreteBuilder:具体的Builder类
Director:统一组装过程
Product
public abstract class User { protected String name; protected String id; protected int age; protected String address; public String getName() { return name; } public void setName(String name) { this.name = name; } public abstract void setId(); public void setAge(int age) { this.age = age; } public void setAddress(String address) { this.address = address; } @SuppressLint("DefaultLocale") @Override public String toString() { return String.format(" User [name : %s, id : %s, age : %d, address : %s]", name,id,age,address); }}
具体的Product类
public class SysUser extends User { public SysUser(){} public void setId() { id = "10086"; }}
抽象的Builder类
public abstract class Builder { public abstract void buildName(String name); public abstract void buildId(); public abstract void buildAge(int age); public abstract void buildAddress(String address); public abstract User create();}
具体的Builder类
public class AccountBuilder extends Builder { private User user = new SysUser(); @Override public void buildName(String name) { user.setName(name); } @Override public void buildId() { user.setId(); } @Override public void buildAge(int age) { user.setAge(age); } @Override public void buildAddress(String address) { user.setAddress(address); } @Override public User create() { return user; }}
Director角色,负责构造User
public class Director { Builder mBuilder = null; public Director(Builder builder){ this.mBuilder = builder; } public void construct(String name,int age,String address){ mBuilder.buildName(name); mBuilder.buildId(); mBuilder.buildAge(age); mBuilder.buildAddress(address); }}
测试代码
public static void main(String[] args) { Builder builder = new AccountBuilder(); Director director = new Director(builder); director.construct("tom", 23, "shenzhen"); System.out.println("Info :" + builder.create().toString()); }
结果输出
Info : User [ name : tom, id : 10086, age : 23, address : shenzhen]
优点:是创建与表示相互隔离,解耦
缺点:创建的类多,复杂的类关系。
Android中使用Builder模式
开发中用到的AlertDialog,示例如下:
private void showDialog(){ AlertDialog.Builder builder=new AlertDialog.Builder(context); builder.setIcon(R.drawable.icon); builder.setTitle("Title"); builder.setMessage("Message"); builder.setPositiveButton("Button1", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //TODO } }); builder.setNegativeButton("Button2", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //TODO } }); builder.create().show();}
阅读全文
0 0
- builder 模式
- Builder模式
- Builder 模式
- Builder模式
- builder模式
- builder模式
- Builder模式
- builder模式
- Builder模式
- Builder 模式
- Builder 模式
- Builder模式
- Builder模式
- builder模式
- builder模式
- builder模式
- Builder模式
- Builder模式
- 云计算4种主流虚拟技术架构对比分析
- Java开发中的23种设计模式--外观模式
- 项目原型副本(SSM)——用于快速搭建项目
- DexClassLoader和PathClassLoader的区别
- 《SSM框架实战》 使用freemarker的常见问题
- Builder模式
- 好用的跨平台框架:webassembly ReactNative Dcloud flutter
- 人类学--中国古人类学(先秦时期的人种类型)
- Linux 文件与文件系统的压缩 gzip,bzip2
- 2017年最新PHP7视频教程,2017年最新PHP实战视频教程,千锋PHP爆炸推出
- HDU-3790 最短路径问题(两个权值,Dijkstra,(含堆优化))
- Android 设置App字体不跟随系统字体改变
- 【排序算法】希尔排序
- 关于 SetProcessWorkingSetSize 的那点事儿