前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >建造者模式多产品情况反射实现

建造者模式多产品情况反射实现

作者头像
the5fire
发布2019-02-28 10:25:44
3880
发布2019-02-28 10:25:44
举报
文章被收录于专栏:Python程序员杂谈

前面在《重温设计模式之建造者模式(Builder)》中关于建造者模式的的介绍比较简单,代码只是实现了基本的模式,因为实际应用中不可能只考虑一个模式的,因此这里给出多个产品情况下的实现。

在那篇文章中我也提到,基本代码中的客户端需要知道的东西太多了,因此这次实现的时候我使用反射来实现。

先给出类结构图:

代码如下:

代码语言:javascript
复制
package builderpattern;

/**
 * 抽象的建造者类
 * @author the5fire
 *
 */
public abstract class AbstractBuilder {

	public abstract void buidPart1();

	public abstract void buildPart2();

	public abstract Product getProduct();

}

package builderpattern;

/**
 * 具体的产品1的建造者
 * @author the5fire
 *
 */
public class Product1Builder extends AbstractBuilder {
	private Product1 product = new Product1();

	@Override
	public void buidPart1() {
		product.add("Builder1_add_part1");

	}

	@Override
	public void buildPart2() {
		product.add("Builder1_add_part2");

	}

	@Override
	public Product getProduct() {
		return product;
	}

}

package builderpattern;

/**
 * 具体的产品2的建造者
 * @author the5fire
 *
 */
public class Product2Builder extends AbstractBuilder {
	private Product2 product = new Product2();

	@Override
	public void buidPart1() {
		product.add("Builder2_add_part1");

	}

	@Override
	public void buildPart2() {
		product.add("Builder2_add_part2");

	}

	@Override
	public Product getProduct() {
		return product;
	}

}

package builderpattern;

/**
 * 具体产品1
 * @author the5fire
 *
 */
public class Product1 extends Product{

	private static StringBuffer strPart = new StringBuffer("product1:");

	public String say() {
		return strPart.toString();
	}

	@Override
	public void add(String str) {
		strPart.append(str);
	}
}

package builderpattern;

/**
 * 具体产品2
 * @author the5fire
 *
 */
public class Product2 extends Product {
	private static StringBuffer strPart = new StringBuffer("product2:");

	public String say() {
		return strPart.toString();
	}

	@Override
	public void add(String str) {
		strPart.append(str);
	}
}

package builderpattern;

/**
 * 指挥者类,指挥完成产品构建,供客户端调用
 * @author the5fie
 *
 */
public class Director {

	private AbstractBuilder builder = null;
	private Product product = null;

	public Director(){}

	/**
	 * 通过构造函数确定要建造那个产品
	 * @param productName
	 */
	public Director(String productName) {
		try {
			builder = (AbstractBuilder)Class.forName("builderpattern." + productName + "Builder").newInstance();
			product = (Product) Class.forName("builderpattern." + productName).newInstance();
			System.out.println(builder.getClass().toString());
		} catch (InstantiationException e) {

			e.printStackTrace();
		} catch (IllegalAccessException e) {

			e.printStackTrace();
		} catch (ClassNotFoundException e) {

			e.printStackTrace();
		}
	}
	/**
	 * 实现构建
	 */
	public void contruct() {
		builder.buidPart1();
		builder.buildPart2();
	}

	public Product getProduct() {
		return product;
	}

}

package builderpattern;

public class Client {
	public static void main(String[] args) {
		Director director = new Director("Product1");
		director.contruct();
		System.out.println(director.getProduct().say());

		director = new Director("Product2");
		director.contruct();
		System.out.println(director.getProduct().say());
	}
}

不知道你发现没有,其实这些模式大多是往类上面或者两个类之间再加上一个类,也就是加上一层,来增加灵活性。那么在这个模式中我能不能够将Director也变为抽象的呢?即在其上加一个类以增加其灵活性。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2010-12-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档