1. 基础介绍
- 主要用来创建复杂的对象;
- 分离了对象子组件的单独构造(Builder负责)和装配(Director负责),这就形成了一个创建复杂对象的基础,首先Builder创建对象,然后Director把所有的对象综合起来;前面的工厂模式,只是创造一个简单的产品(其中的组装顺序一样);
- 由于构建和组装进行了解耦(也就是分开);这样通过不同构建器,或者不同的组装顺序,都可以获得不同的对象(类似于产品);
2.简单使用
- 基本步骤记录(以创建电脑为例,只写入部分组件):
首先创建一个电脑类,其中定义好例如CPU,VideoCard,Power属性(其实这些属性都是类,也可以有自己的属性,比如电源可以有自己的品牌,有自己的风扇之类的);
接下来创建一个Builder接口,比如这里可以创建成ComputerBuilder接口,在里面创建一些方法(这里理解为用于创建三个属性的类的方法);
创建一个Director接口,这里可以创建为ComputerDirector接口,这个接口用于创建一个组装的的方法;
创建一个ComputerBuilder的实现类,实现这个接口的所有方法;
创建一个ComputerDirector的实现类,对这个接口中的方法进行实现;在这里面必须要有一个构建者的对象(比如:ComputerBuilder),因为需要先进行构建,再进行组合;同时返回一个成品;
具体程序如下:
第一个步骤:
//创建总的电脑类;
public class Computer {
//定义电脑的部分组件类作为属性;
private CPU cpu;
private VideoCard videoCard;
private Power power;
//定义好各个属性的getter,setter方法
public CPU getCpu() {
return cpu;
}
public void setCpu(CPU cpu) {
this.cpu = cpu;
}
public VideoCard getVideoCard() {
return videoCard;
}
public void setVideoCard(VideoCard videoCard) {
this.videoCard = videoCard;
}
public Power getPower() {
return power;
}
public void setPower(Power power) {
this.power = power;
}
}
//在这里为各个属性类也进行定义,如果需要,这里也可以使用工厂模式进行合作使用,
class CPU {
private String brand;
public CPU(String brand) {
this.brand = brand;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
@Override
public String toString() {
return "brand=" + brand;
}
}
class VideoCard {
private String brand;
public VideoCard(String brand) {
this.brand = brand;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
}
//如果有多个属性也是可以写的;
class Power {
private String brand;
private String fan;
public Power(String brand, String fan) {
this.brand = brand;
this.fan = fan;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getFan() {
return fan;
}
public void setFan(String fan) {
this.fan = fan;
}
}
** 第二个步骤:**
//创建一个ComputerBuilder接口,
public interface ComputerBuilder {
CPU createCPU();
Power createPower();
VideoCard createVideoCard();
}
第三个步骤:
//用于创建一个组装的方法;
public interface ComputerDirector {
Computer directorALl();
}
第四个步骤:
//定义一个ComputerBuilder的实现类;
public class ChComput implements ComputerBuilder{
@Override
public CPU createCPU() {
System.out.println("这是中国创造的CPU");
return new CPU("Chinese Create");
}
@Override
public Power createPower() {
System.out.println("中国创造的电源");
return new Power("Chinese Create", "有风扇");
}
@Override
public VideoCard createVideoCard() {
System.out.println("中国创造的显卡");
return new VideoCard("Chinese Create");
}
}
第五个步骤:
//这个是ComputerDirector的实现类
public class ChComputerDirector implements ComputerDirector{
//这里由于是需要用到之前的一些属性类,所以需要有ComputerBuilder的实现类的对象,我们可以用多态来表示;
private ComputerBuilder combuilder;
//创建一个构造器将上面的对象传进来;
public ChComputerDirector(ComputerBuilder combuilder) {
this.combuilder = combuilder;
}
@Override
public Computer directorALl() {
//通过上面传进来的实现类创建CPU类的对象;
CPU cpu = combuilder.createCPU();
//创建电源对象
Power power = combuilder.createPower();
//创建显卡对象
VideoCard videoCard = combuilder.createVideoCard();
/*创建完三个基本的属性类对象,但是还是没有合成computer,
* 这里还需要使用到Computer类里面的getter和setter方法;
* */
Computer computer = new Computer();
computer.setCpu(cpu);
computer.setPower(power);
computer.setVideoCard(videoCard);
//到这里就可以返回Computer对象了;
return computer;
}
}
最后一步:简单的测试一下
public class test {
public static void main(String[] args) {
//在这里定义了ComputerDirector类的对象
ComputerDirector computerDirector = new ChComputerDirector(new ChComput());
//这里就可以通过ComputerDirector的方法获得Computer类的对象,就已经相当于创建好了一台Computer
Computer computer = computerDirector.directorALl();
//你可以根据这个对象,获得各个Computer的其中的参数;比如电脑用了什么电源,用来说明CPU等等,还可以在电脑里面添加一些功能;
System.out.println(computer.getCpu());
}
}
测试结果: