笔者是一个大二的菜鸟,刚确定自己的方向搞安卓开发。无意间发现一本书叫《大话设计模式》,于是借鉴并加上自己的理解,来整理编程的设计模式。所有代码是用java来写的,但其中的编程思想和语言无关。
1.介绍
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
2.例子
现在超市需要一个软件,能够根据客户买入价格以及超市自己的消费策略计算客户实际的消费价格。现在假设超市的消费策略有“原价”,“八折”,“买300返30”。
3.分析
在我刚开始学编程的时候,我一定会把每一项都列一个if语句,然后根据输入一个一个的判断得出结果。但这样做会十分的繁琐,并且代码的重复率太高了。面对这种多选择的情况,往往一个switch可以解决,再加上面向对象的思想,针对三个消费策略创建三个类分别实例化,根据switch-case决定调用哪个类的方法,问题就解决了。
但仔细一想,这样每次操作都要实例化三个对象,很没有必要。于是,我把实例化的部分放到case里面进行,一次调用只用实例化一次。顺便再把这个操作封装起来为一个类就OK了。这样的类可以称为工厂,而这种模式就是工厂模式。可以把工厂理解为制造对象的场所。
4.代码部分
因为三个类的方法大体相同,所以可以先定义一个抽象类,让三个类去重载其方法。
/**抽象类*/
abstract class CashSuper{
public abstract double acceptCash(double money);
}
三个消费策略对应的类
/**通常消费类,无减价*/
class CashNormal extends CashSuper{
@Override
public double acceptCash(double money) {
// TODO Auto-generated method stub
return money;
}
}
/**根据利率减价*/
class CashRebate extends CashSuper{
private double moneyRebate = 1d;//返利率,初始值为1.0
CashRebate(double m) {
this.moneyRebate = m;
}
@Override
public double acceptCash(double money) {
// TODO Auto-generated method stub
return moneyRebate*money;
}
}
/**根据产品减价*/
class CashReturn extends CashSuper{
private double moneyCondition = 0.0d;
private double moneyReturn = 0.0d;
CashReturn(double mc,double mr) {
this.moneyCondition = mc;
this.moneyReturn = mr;
}
工厂类以及主函数(程序操作口)
public class CashFactory {
public static CashSuper createCashAccept(int type) {
CashSuper cs = null;
switch(type) {
case 1:
cs = new CashNormal();
break;
case 2:
CashReturn cr1 = new CashReturn(300,30);
cs = cr1;
break;
case 3:
CashRebate cr2 = new CashRebate(0.8);
cs = cr2;
break;
}
return cs;
}
public static void main(String args[]) {
Scanner in = new Scanner(System.in);
System.out.println("请选择收费类型\n1.正常收费\n2.满300减30\n3.打0.8折");
int type = in.nextInt();
System.out.println("请输入原价:");
double money = in.nextDouble();
CashSuper csuper =CashFactory.createCashAccept(type);
double newMoney = csuper.acceptCash(money);
System.out.println("现价钱:\n"+String.valueOf(newMoney)+"\n");
}
}
总结工厂模式大致就是这种设计。如果我想增加一种消费策略,可以再创建一个类,然后只用在工厂里面改写(新增一个case)。但是工厂模式只解决了创建对象的问题,如果超市经常性地改变策略,每次都要改动工厂,就很麻烦了。所以就要考虑其他模式——策略模式,后续再进行更新。