设计模式学习(六)创建者模式

创建者模式就是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,而且客户端不用知道对象的构建细节。

抽象工厂与创建者类似,只是创建者模式进一步的实现了类的单一职责。


//*******************Pasta.java************************

public interface Pasta {
	
	void showPrice();
	
}

//******************Mantou.java***********************

public class Mantou implements Pasta {
	
	public void ShowPrice() {
		
		System.out.println("The Mantou is 0.5 yuan.");
		
	}
	
}

//****************Baozi.java****************************

public class Baozi implements Product {
	
	public void showPrice() {
		System.out.println("The Baozi is 0.8 yuan.");
	}
	
}

//***************Vegetable.java*************************

public interface Vegetable {
	
	void showNutrition();
	
}

//*****************Baicai.java**************************

public class Baicai implements Vegetable {
	
	public void showNutrition() {
		
		System.out.println("baicai has more nutrition than tofu.");
		
	}
	
}

//*********************Tofu.java****************************

public class Tofu implements Vegetable {
	
	public void showNutrition() {
		
		System.out.println("tofu has less nutrition than baicai.");
		
	}
	
}

//*******************FactoryMethod.java*********************

public class FactoryMethod {
	
	abstract Pasta factoryMethodPrice();
	abstract Vegetable factoryMethodNutrition();
	
}

//****************Factory1.java**************************

public class Factory1 extends FactoryMethod {
	
	public Pasta factoryMethodPrice() {
		
		return new Mantou();
		
	}
	
	public Vegetable factoryMethodNutrition() {
		
		return new Baicai();
		
	}
	
}

//*********************Factory2.java***************************

public class Factory2 extends FactoryMethod {
	
	public Pasta factoryMethodPrice() {
		
		return new Baozi();
		
	}
	
	public Vegetable factoryMethodNutrition() {
		
		return new Tofu();
		
	}
	
}

//********************Director.java**********************

public class Director {
	
	private FactoryMethod factoryMethod;
	
	public FactoryMethod getFactoryMethod() {
		
		return factoryMethod;
		
	}
	
	public void setFactoryMethod(FactoryMethod factoryMethod) {
		this.factoryMethod = factoryMethod;
	}
	
		public void sayTxt() {
		
		Pasta pasta = factoryMethodPasta();
		Vegetable vegetble = factoryMethodVegetable();
		System.out.println(pasta.showPrice()+"-------"vegetable.showNutrition());
		
	}
	
}

//******************Client.java****************************

public class Client {
	
	public static void main(String []args) {
		Director director = new Director();
		director.setFactoryMethod(new Factory1());
		director.sayTxt();
		director.setFactoryMethod(new Factory2());
		director.sayTxt();
		
	}
	
}


由上例可以看出,与抽象工厂唯一的区别就在于,抽象工厂中职责分散,此时抽象工厂不在实现satTxt函数而是创建了一个类Director进行实现,这就是创建者模式。


下面再看一段代码,是创建者模式在薪酬模块中的实际应用。


在薪酬模块中,需要对员工的基本工资,奖金,保险,个人所得税依次进行计算,而且需要区分不同的工种,比如劳务工,合同工等,这明显要用到抽象工厂模式,因此,定义抽象工厂类,代码如下:

package builder;

public abstract class Factory {

	protected abstract BasePay getBasePay();
	protected abstract Assurance getAssurance();
	protected abstract Bonus getBonus();
	protected abstract Tax getTax();
	
}

定义创建者类:

package builder;

public class Director {
 
	private Factory factory;

	public Factory getFactory() {
		return factory;
	}

	public void setFactory(Factory factory) {
		this.factory = factory;
	}
	
	
	public String doSalary(String name) {
		
		BasePay baseBay = factory.getBasePay();
		Assurance assurance = factory.getAssurance();
		Bonus bonus = factory.getBonus();
		Tax tax = factory.getTax();
		
		return baseBay.doBasePay(name) +"------"+assurance.doAssurance(name)+"------"+bonus.doBonus(name) +
				"----" +tax.doTax(name);
		
	}
	
}

定义合同工的工厂类,代码如下:

package builder;

public class ContractFactory extends Factory {

	@Override
	protected BasePay getBasePay() {
		// TODO Auto-generated method stub
		return new ContractBasePay();
	}

	@Override
	protected Assurance getAssurance() {
		// TODO Auto-generated method stub
		return new ContractAssurance();
	}

	@Override
	protected Bonus getBonus() {
		// TODO Auto-generated method stub
		return new ContractBonus();
	}

	@Override
	protected Tax getTax() {
		// TODO Auto-generated method stub
		return new ContractTax();
	}

}

劳务工的工厂类,代码如下

package builder;

public class WorkerFactory extends Factory {

	@Override
	protected BasePay getBasePay() {
		// TODO Auto-generated method stub
		return new WorkerBasePay();
	}

	@Override
	protected Assurance getAssurance() {
		// TODO Auto-generated method stub
		return new WorkerAssurance();
	}

	@Override
	protected Bonus getBonus() {
		// TODO Auto-generated method stub
		return new WorkerBonus();
	}

	@Override
	protected Tax getTax() {
		// TODO Auto-generated method stub
		return new WorkerTax();
	}

}

基本薪资计算接口:

package builder;

public interface BasePay {

	String doBasePay(String name);

}
合同工基本薪资计算类:

package builder;

public class ContractBasePay implements BasePay {

	@Override
	public String doBasePay(String name) {
		// TODO Auto-generated method stub
		return name + "基本工资";
	}

}

劳务工基本薪资计算类

package builder;

public class WorkerBasePay implements BasePay {

	@Override
	public String doBasePay(String name) {
		// TODO Auto-generated method stub
		return name + "基本工资";
	}

}

奖金计算接口:

package builder;

public interface Bonus {

	String doBonus(String name);

}

合同工奖金计算类:

package builder;

public class ContractBonus implements Bonus {

	@Override
	public String doBonus(String name) {
		// TODO Auto-generated method stub
		return name + "奖金";
	}

}

劳务工奖金计算类:

package builder;

public class WorkerBonus implements Bonus {

	@Override
	public String doBonus(String name) {
		// TODO Auto-generated method stub
		return name + "奖金";
	}

}

保险计算接口:

package builder;

public interface Assurance {

	String doAssurance(String name);

}

合同工保险计算类:

package builder;

public class ContractAssurance implements Assurance {

	@Override
	public String doAssurance(String name) {
		// TODO Auto-generated method stub
		return name + "保险";
	}

}

劳务工保险计算类

package builder;

public class WorkerAssurance implements Assurance {

	@Override
	public String doAssurance(String name) {
		// TODO Auto-generated method stub
		return name + "保险";
	}

}

个人所得税计算接口:

package builder;

public interface Tax {

	String doTax(String name);

}

合同工个人所得税计算类:

package builder;

public class ContractTax implements Tax {

	@Override
	public String doTax(String name) {
		// TODO Auto-generated method stub
		return name + "个人所得税";
	}

}

劳务工个人所得税计算类:

package builder;

public class WorkerTax implements Tax {

	@Override
	public String doTax(String name) {
		// TODO Auto-generated method stub
		return name + "个人所得税";
	}

}

客户端代码:

package builder;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Director director = new Director();
		director.setFactory(new ContractFactory());
		System.out.println(director.doSalary("合同工"));
		director.setFactory(new WorkerFactory());
		System.out.println(director.doSalary("劳务工"));
		
	}

}

创建型的模式主要有单例,简单工厂,工厂方法,抽象工厂,原型和创建者模式,这六种模式主要是为了进行对象的创建。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值