实际问题:
由于超市隔三差五就要办促销活动,但每次促销活动的方式不一样,所以需要开发一个软件,营业员只要输入原价再选择活动类型后,就能计算出折扣以后的价钱。
普通人的做法:
mian(){ String input = readLine(); double price = readLine(); switch (input) case "九五折": price = price * 0.95; break; case "满100返50": if(price>=100) price = price - 50; break; case "不打折": break; println("打折后价钱:"+price); }
这样写会有几个问题:
1.若现在增加新的打折方式,就要修改这段代码,这就打破了“开放-封闭”的原则。
2.这段代码不易复用。当这个收银系统的其他地方也需要计算折后价的时候,只能将这段代码复制过去;那如果在维护中发现开发人员把“满100返50”写成了“满10000返50”,这时候就需要改两个地方,非常不便。
所以高级做法是:
1.将这一个个折扣抽象成类,这样方便代码的复用;
2.将对不同折扣的判断从客户程序中转移到被调用类中,从而降低客户程序中代码的复杂度。
高级做法的类图:
1.此时,对促销类型的判断从客户端转移到了Factory类中,从而用户程序只需要给Factory的get促销类()函数传入一个促销名称就能够获取该促销类的对象。
2.代码如上图构造之后,要获取促销类对象,只需要调用:
促销类 促销对象 = Factory.get促销类("促销名称");
折后价 price = 促销对象.getResult(原价);
工厂模式的作用:
工厂是用来管理、创建对象的。
如果一个类会根据情况的不同产生含有不同属性值的对象,或者一个类会根据情况的不同产生不同的子类对象,这时候需要使用工厂模式,在工厂中完成究竟创建哪种类型的对象的判断,客户端只需在Factory.getBean(key)函数中传入一个key,就能够获取对应类型的对象。
因此,工厂模式能够将“客户端对究竟创建何种类型的判断”转移到Factory中,从而减少客户端代码的复杂度,降低服务端与客户端之间的藕合度。