6.创建者模式(Builder)
在抽象工厂模式中,一个具体的工厂类负责创建一系列相互关联的对象,但此时工厂类的职责并不单一,如果组装变得复杂,则工厂类将会变得很庞大,不利于维护。创建者模式就是将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示,而且客户端不用知道对象的构建细节。
创建者模式的实现原理
创建者模式在薪酬模块的实际应用
在薪酬模块中,需要对员工的基本工资、奖金、保险、个人所得税等进行计算,而且需要区分不同的工种,比如劳务工、合同工等。
Factory
//抽象工厂类
public abstract class Factory {
protected abstract BasePay getBasePay();
protected abstract Bonus getBonus();
}
ContractFactory
//定义合同工的工厂类
public class ContractFactory extends Factory {
public BasePay getBasePay(){
return new ContractBasePay();
}
public Bonus getBonus(){
return new ContractBonus();
}
}
WorkerFactory
//劳务工的工厂类
public class WorkerFactory extends Factory {
public BasePay getBasePay(){
return new WorkerBasePay();
}
public Bonus getBonus(){
return new WorkerBonus();
}
}
BasePay
// 薪资计算(产品)接口
public interface BasePay {
public String doBasePay(String name);
}
ContractBasePay
// 合同工的薪资计算(产品)实现类
public class ContractBasePay implements BasePay {
@Override
public String doBasePay(String name) {
// TODO Auto-generated method stub
return name + "基本工资开始计算";
}
}
WorkerBasePay
//劳务工的信自己算(产品)实现类
public class WorkerBasePay implements BasePay {
@Override
public String doBasePay(String name) {
return name + "基本工资开始计算";
}
}
Bonus
//奖金计算(产品)的接口类
public interface Bonus {
public String doBonus(String name);
}
ContractBonus
//合同工的奖金计算(产品)实现类
public class ContractBonus implements Bonus {
@Override
public String doBonus(String name) {
// TODO Auto-generated method stub
return name + "奖金开始计算";
}
}
WorkerBonus
//劳务工的奖金计算(产品)实现类
public class WorkerBonus implements Bonus {
@Override
public String doBonus(String name) {
// TODO Auto-generated method stub
return name + "奖金开始计算";
}
}
Director
//定义创建者类
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 basePay = factory.getBasePay();
Bonus bonus = factory.getBonus();
return basePay.doBasePay(name) + "---" + "---" + bonus.doBonus(name) ;
}
}
Client
public class Client {
public static void main (String[] args) {
Director director = new Director();
director.setFactory(new WorkerFactory());
System.out.println(director.doSalary("劳务工"));
}
}