第三章:Java设计模式-建造者模式

建造者模式

意图:把某个复杂的对象和行为表示的方式分离,以同样的行为方式表达不同的意思

优点:适用于部件变化少,组件变化多的场景。组件易于扩展。

缺点:对象的行为需要类似,并且组件可能会很多。

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());
	}
}

本章完结,待续!

本文说明:该文章属于原创,如需转载,请标明文章转载来源

猜你喜欢

转载自blog.csdn.net/p812438109/article/details/81783631