Builder模式

xiaoxiao2021-02-28  117

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(); }
转载请注明原文地址: https://www.6miu.com/read-73696.html

最新回复(0)