建造者模式
意图:把某个复杂的对象和行为表示的方式分离,以同样的行为方式表达不同的意思
优点:适用于部件变化少,组件变化多的场景。组件易于扩展。
缺点:对象的行为需要类似,并且组件可能会很多。
1)创建一个播放机接口,该播放机类型可有多种
package com.xm.designpattern.builder;
/**
* 播放器,可包含不同的播放器
* @author ouyangjun
*/
public interface Player {
public void create();
}
2)新增创建一个音乐播放器
package com.xm.designpattern.builder;
public class MusicPlayer implements Player {
@Override
public void create() {
System.out.println("MusicPlayer 创建一个音乐播放器!");
}
}
3)新增一个对象行为方式表达的接口
package com.xm.designpattern.builder;
/**
* 复杂对象的接口类
* @author ouyangjun
*/
public interface Option {
public Player create();
public String player();
public String type();
}
4)包装一个音乐播放器抽象类
package com.xm.designpattern.builder;
/**
* 包装一个音乐播放器的抽象类
*/
public abstract class MusicWrapper implements Option {
@Override
public Player create() {
return new MusicPlayer();
}
@Override
public abstract String player();
@Override
public abstract String type();
}
5)新增一个播放流行音乐的实现类
package com.xm.designpattern.builder;
public class PopularMusic extends MusicWrapper {
@Override
public String player() {
return "音乐播放器开始播放《离人愁》";
}
@Override
public String type() {
return "流行音乐";
}
}
6)新增一个播放推荐音乐的实现类
package com.xm.designpattern.builder;
public class RecommendMusic extends MusicWrapper {
@Override
public String player() {
return "音乐播放器开始播放《风的季节》";
}
@Override
public String type() {
return "推荐音乐";
}
}
7)创建一个建造者工具类
package com.xm.designpattern.builder;
/**
* 建造工具类
* @author ouyangjun
*/
public class PlayerBuilder {
/**
* 初始化音乐播放器
*/
public void createMusicPlayer(){
Player player = new MusicPlayer();
player.create();
}
/**
* 流行音乐
* @return
*/
public MusicWrapper createPopularMusic(){
return new PopularMusic();
}
/**
* 推荐音乐
* @return
*/
public MusicWrapper createRecommendMusic(){
return new RecommendMusic();
}
}
8)音乐播放器测试类
package com.xm.designpattern.builder;
public class TestPlayerBuilder {
public static void main(String[] args) {
// 初始化构造器
PlayerBuilder builder = new PlayerBuilder();
// 音乐
builder.createMusicPlayer();
MusicWrapper popularMusic = builder.createPopularMusic();
System.out.println(popularMusic.type()+">"+popularMusic.player());
MusicWrapper recommendMusic = builder.createRecommendMusic();
System.out.println(recommendMusic.type()+">"+recommendMusic.player());
System.out.println("-----------------------------------------");
}
}
运行效果图如下:
9)添加一个视频播放器
package com.xm.designpattern.builder;
public class VideoPlayer implements Player {
@Override
public void create() {
System.out.println("VideoPlayer 创建一个视频播放器!");
}
}
10)包装一个视频播放器抽象类
package com.xm.designpattern.builder;
/**
* 包装一个视频播放器的抽象类
* @author ouyangjun
*/
public abstract class VideoWrapper implements Option {
@Override
public Player create() {
return new VideoPlayer();
}
@Override
public abstract String player();
@Override
public abstract String type();
}
11)新增一个播放流行电影的实现类
package com.xm.designpattern.builder;
public class PopularVideo extends VideoWrapper {
@Override
public String player() {
return "视频播放器开始播放《西虹市首富》";
}
@Override
public String type() {
return "流行电影";
}
}
12)新增一个播放推荐电影的实现类
package com.xm.designpattern.builder;
public class RecommendVideo extends VideoWrapper {
@Override
public String player() {
return "视频播放器开始播放《一出好戏》";
}
@Override
public String type() {
return "推荐电影";
}
}
13)在建造者工具类PlayerBuilder.java添加一些代码
/**
* 初始化视频播放器
*/
public void createVideoPlayer(){
Player player = new VideoPlayer();
player.create();
}
/**
* 流行电影
* @return
*/
public VideoWrapper createPopularVideo(){
return new PopularVideo();
}
/**
* 推荐电影
* @return
*/
public VideoWrapper createRecommendVideo(){
return new RecommendVideo();
}
14)在测试类TestPlayerBuilder.java添加一些代码
package com.xm.designpattern.builder;
public class TestPlayerBuilder {
public static void main(String[] args) {
// 初始化构造器
PlayerBuilder builder = new PlayerBuilder();
// 音乐
builder.createMusicPlayer();
MusicWrapper popularMusic = builder.createPopularMusic();
System.out.println(popularMusic.type()+">"+popularMusic.player());
MusicWrapper recommendMusic = builder.createRecommendMusic();
System.out.println(recommendMusic.type()+">"+recommendMusic.player());
System.out.println("-----------------------------------------");
// 视频
builder.createVideoPlayer();
VideoWrapper popularVideo = builder.createPopularVideo();
System.out.println(popularVideo.type()+">"+popularVideo.player());
VideoWrapper recommendVideo = builder.createRecommendVideo();
System.out.println(recommendVideo.type()+">"+recommendVideo.player());
}
}
运行之后效果图如下:
附加另一种方式实现建造者模式,代码如下
/**
* 建造员工信息
* @author ouyangjun
*/
public class EmployeeBuilder {
private String name;
private String age;
private String phone;
public EmployeeBuilder(){}
public EmployeeBuilder(String name, String age, String phone) {
super();
this.name = name;
this.age = age;
this.phone = phone;
}
public String getName() {
return name;
}
public String getAge() {
return age;
}
public String getPhone() {
return phone;
}
/**
* 建造者接口
* @author ouyangjun
*/
public interface Builder {
Builder setName(String name);
Builder setAge(String age);
Builder setPhone(String phone);
EmployeeBuilder builder();
}
public static class PeopleBuilder implements Builder {
private String name;
private String age;
private String phone;
public Builder getBuilder(){
return new PeopleBuilder();
}
@Override
public Builder setName(String name) {
this.name = name;
return this;
}
@Override
public Builder setAge(String age) {
this.age = age;
return this;
}
@Override
public Builder setPhone(String phone) {
this.phone = phone;
return this;
}
@Override
public EmployeeBuilder builder() {
return new EmployeeBuilder(this.name, this.age, this.phone);
}
}
public static void main(String[] args) {
EmployeeBuilder t = new PeopleBuilder().getBuilder()
.setName("dashu")
.setAge("27")
.setPhone("13699998888").builder();
System.out.println(t.getName()+" "+t.getAge()+" "+t.getPhone());
}
}
本章完结,待续!
本文说明:该文章属于原创,如需转载,请标明文章转载来源