创建者模式就是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,而且客户端不用知道对象的构建细节。
抽象工厂与创建者类似,只是创建者模式进一步的实现了类的单一职责。
//*******************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();
}
}
下面再看一段代码,是创建者模式在薪酬模块中的实际应用。
在薪酬模块中,需要对员工的基本工资,奖金,保险,个人所得税依次进行计算,而且需要区分不同的工种,比如劳务工,合同工等,这明显要用到抽象工厂模式,因此,定义抽象工厂类,代码如下:
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("劳务工"));
}
}
创建型的模式主要有单例,简单工厂,工厂方法,抽象工厂,原型和创建者模式,这六种模式主要是为了进行对象的创建。