上次使用简单工厂提出了我们的解决方案,但存在一定的问题,现在我们继续改在。
需求:一零售公司,下属多个代理商,公司根据代理商的销售情况,给与其相应级别,而代理商为了更好的刺激其员工的积极性,让工资与其级别直接 挂钩,如一级代理则工资全发,二级代理则发90%,三级80%。。。。具体发放比例代理商自定,也就是说在具体计算工资前,首先要得到其对应的级别,即在工厂类里创建了对象后,需将对应的级别赋予它。假如我们用简单工厂来处理,会发现存在一定问题,见上篇。
现在我们试着进一步完善我们的方案:
1.工资计算规则类
package com.baihao.FactoryMethod;
public interface Salary {
public void computerSalary();
}
2.具体代理商1:
package com.baihao.FactoryMethod;
public class ShanXiSalary implements Salary {
private int level = 0;
private float salary = 0;
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public float getSalary() {
return salary;
}
public void setSalary(float salary) {
this.salary = salary;
}
//为了讲解的方便,此处将发放比例硬编码
@Override
public void computerSalary() {
System.out.println("陕西工资计算:");
if(level == 1)
System.out.println("张三应发工资"+salary*0.9);
if(level == 2)
System.out.println("张三应发工资"+salary*0.8);
}
}
3.具体代理商2:
package com.baihao.FactoryMethod;
public class HeBeiSalary implements Salary {
private int level = 0;
private float salary = 0;
public float getSalary() {
return salary;
}
public void setSalary(float salary) {
this.salary = salary;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
//为了讲解的方便,此处将发放比例硬编码
@Override
public void computerSalary() {
System.out.println("河北工资计算:");
if(level == 1)
System.out.println("张三应发工资"+salary*0.8);
if(level == 2)
System.out.println("张三应发工资"+salary*0.7);
}
}
4.抽象工厂:
package com.baihao.FactoryMethod;
public interface Factory {
public Salary getSalary();
}
5.具体代理商工厂1
package com.baihao.FactoryMethod;
public class ShanXiSalaryFactory implements Factory {
@Override
public Salary getSalary() {
ShanXiSalary salary = new ShanXiSalary();
salary.setLevel(2);
salary.setSalary(10000);
return salary;
}
}
6.具体代理商工厂2:
package com.baihao.FactoryMethod;
public class HeBeiSalaryFactory implements Factory {
@Override
public Salary getSalary() {
HeBeiSalary salary = new HeBeiSalary();
salary.setLevel(2);
salary.setSalary(10000);
return salary;
}
}
7.客户端调用:
package com.baihao.FactoryMethod;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
Salary salary = new HeBeiSalaryFactory().getSalary();
salary.computerSalary();
System.out.println("-----------------------------------");
salary = new ShanXiSalaryFactory().getSalary();
salary.computerSalary();
}
}
这样改造后,将工厂分离出更多的小工厂,这样类的职责更明确,结构更清晰了。此方案为“工厂方法”模式
但一般单位核算工资的时候,也会对其他的方面进行核算,如:所得税,社保等,如果这样的话,以我们当前的解决方案,该怎么做呢?答案是:增加两个陕西产品类(所得税/社保),两个河北产品类(所得税/社保)、两个陕西工厂类(所得税/社保工厂)、两个河北工厂类(所得税/社保工厂)。那假如后期增加了其他的计算和代理商呢?这样的话工厂类会大爆发了。。。。。
下面我们继续对方案进行改造,见下篇“抽象 工厂”模式。