23种设计模式之建造者模式
2018-12-27 本文已影响0人
阿跳爱学习
优点:不必知道内部实现,解耦合,可扩展性高。
缺点:如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
使用场景:对某个对象构造复杂的情况下使用。
主要分两部分:
1.构建者(Bulider)
2.组装者(Director)
建造者,主要是构建者和组装者的分工解耦,比如我要建造一台iphone手机,手机有很多的零部件,比如主板、摄像头、电池、外壳等等各种小零件,这些东西构建者(Bulider)负责把它们做出来,而组装者(Director)则负责把它们组装起来,形成一台手机。
准备工作
创建手机各个部件的实体类,例子从简,分外壳和主板。
外壳类(Shell):
/**
* 这是一个手机外壳类
*/
public class Shell {
private String name;
public Shell(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
主板类(Motherboard):
/**
* 这是一个手机主板类
*/
public class Motherboard {
private String name;
public Motherboard(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
手机类(Phone):
/**
* 这是一个手机类
*/
public class Phone {
private Motherboard motherboard;
private Shell shell;
public Motherboard getMotherboard() {
return motherboard;
}
public void setMotherboard(Motherboard motherboard) {
this.motherboard = motherboard;
}
public Shell getShell() {
return shell;
}
public void setShell(Shell shell) {
this.shell = shell;
}
}
步入主题
构建者
创建一个构建者接口(PhoneBulider),主要工作用于实现构建主板和构建外壳:
/**
* 这是一个构建者接口
*/
public interface PhoneBulider {
Motherboard buliderMotherboard();
Shell buliderShell();
}
创建一个构建者实现类(IphoneBulider):
/**
* 这是苹果手机构建实现类
*/
public class IphoneBulider implements PhoneBulider{
@Override
public Motherboard buliderMotherboard() {
Log.d("TAG","构建苹果手机主板");
return new Motherboard("苹果手机主板");
}
@Override
public Shell buliderShell() {
Log.d("TAG","构建苹果手机外壳");
return new Shell("苹果手机外壳");
}
}
然后步入组装。
组装者
先创建一个组装者接口(PhoneDirector):
/**
*这是一个组装者接口
*/
public interface PhoneDirector {
Phone directorPhone();
}
再创建一个组装者实现类:
/**
* 这是一个苹果手机组装实现类
*/
public class IphoneDirector implements PhoneDirector {
private PhoneBulider phoneBulider;
public IphoneDirector(PhoneBulider phoneBulider){
this.phoneBulider = phoneBulider;
}
@Override
public Phone directorPhone() {
//让构建者构建好主板与外壳
Motherboard motherboard = phoneBulider.buliderMotherboard();
Shell shell = phoneBulider.buliderShell();
//构建好之后进行组装
Phone phone = new Phone();
phone.setMotherboard(motherboard);
phone.setShell(shell);
return phone;
}
}
构建者和组装者都写完了,最后调用试试。
/**
* 这是调用者
*/
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PhoneDirector phoneDirector = new IphoneDirector(new IphoneBulider());
Phone phone = phoneDirector.directorPhone();
Log.d("TAG", "组装好的Phone = " + phone + "\nMotherboard = " + phone.getMotherboard().getName() + "\nshell = " + phone.getShell().getName());
}
}

已完成测试!有不对的地方欢迎指出,感恩。