设计模式之工厂模式二

上次使用简单工厂提出了我们的解决方案,但存在一定的问题,现在我们继续改在。

需求:一零售公司,下属多个代理商,公司根据代理商的销售情况,给与其相应级别,而代理商为了更好的刺激其员工的积极性,让工资与其级别直接 挂钩,如一级代理则工资全发,二级代理则发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();
  
 }

}

 

这样改造后,将工厂分离出更多的小工厂,这样类的职责更明确,结构更清晰了。此方案为“工厂方法”模式

但一般单位核算工资的时候,也会对其他的方面进行核算,如:所得税,社保等,如果这样的话,以我们当前的解决方案,该怎么做呢?答案是:增加两个陕西产品类(所得税/社保),两个河北产品类(所得税/社保)、两个陕西工厂类(所得税/社保工厂)、两个河北工厂类(所得税/社保工厂)。那假如后期增加了其他的计算和代理商呢?这样的话工厂类会大爆发了。。。。。

下面我们继续对方案进行改造,见下篇“抽象 工厂”模式。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值