?
?
可是即使这样,也有不尽如人意的地方,方便面有很多种做法,每个人的做法不尽相同,当然上面就只有几个因素。比如一个人喜欢先加油,再配料;另外一个人喜欢先配料,再加油。你可能会觉得不就是泡面嘛,讲究这么多干嘛。可是,严格的说,这些先后顺序是会影响我们的面的口感的。如果只是上面的两种先后顺序,可能你会说,简单工厂可以搞定,可是如果因素比较多了,并且我们无法事先把所有因素都放进简单工厂内,那么后面来了新的要求,我们就没有办法,需要更改简单工厂的代码了,这就违反了开闭原则。所以,使用工厂方法来解决这个问题。工厂方法的解决方案是下面这样。
?
- interface InstantNoodle
- {
- voidaddOil();// 意思是加油
- ?
- voidaddPeiLiao();// 意思是加配料,原谅我用汉字拼音表示
- }
- ?
- class HaiXian implements InstantNoodle
- {// 意思是海鲜面
- publicHaiXian()
- {
- System.out.println(拆了一包海鲜面);
- }
- ?
- publicvoid addOil()
- {
- System.out.println(加了点油);
- }
- ?
- publicvoid addPeiLiao()
- {
- System.out.println(加了点海鲜风味的配料);
- }
- }
- ?
- class HongShao implements InstantNoodle
- {// 意思是红烧面
- publicHongShao()
- {
- System.out.println(拆了一包红烧面);
- }
- ?
- publicvoid addOil()
- {
- System.out.println(加了点油,红烧面的油味道比较重哦!);
- }
- ?
- publicvoid addPeiLiao()
- {
- System.out.println(经典的红烧面配料);
- }
- }
- ?
- interface Factory
- {
- InstantNoodlecreate();
- }
- ?
- // 海鲜面制作工厂,使用先加油,后放配料做法
- class HaiXianFac1 implements Factory
- {
- publicInstantNoodle create()
- {
- System.out.println(我要开始做海鲜面了,制作手法为先加油,后放配料);
- InstantNoodlenoodle = new HaiXian();
- noodle.addOil();// 这里是先加油,后放配料
- noodle.addPeiLiao();
- System.out.println(-----------------------------------------------);
- returnnoodle;
- }
- }
- ?
- // 海鲜面制作工厂,使用先放配料,后加油做法
- class HaiXianFac2 implements Factory
- {
- publicInstantNoodle create()
- {
- System.out.println(我要开始做海鲜面了,使用制作手法为先放配料,后加油);
- InstantNoodlenoodle = new HaiXian();
- noodle.addPeiLiao();
- noodle.addOil();// 这里是先放配料,后加油
- System.out.println(-----------------------------------------------);
- returnnoodle;
- }
- }
- ?
- public class Main
- {
- publicstatic void main(String[] args)
- {
- ?
- //假设现在肚子饿了,开始做面,第一个人想吃海鲜面,他喜欢先加油,后放配料
- Factoryfac1 = new HaiXianFac1();
- InstantNoodlenoodle1 = fac1.create();
- ?
- //另外一个人也想要吃海鲜面,他喜欢先方配料,后加油
- Factoryfac2 = new HaiXianFac2();
- InstantNoodlenoodle2 = fac2.create();
- ?
- }
- }
?
加入还有一些人对红烧面有一些要求,新建工厂类,来生产符合这个要求的产品,这样的做法更加符合开闭原则。通过使用工厂方法,可以解决上述的问题。当然也许会有更好的解决方案,我说上述的例子,只是为了能够表示工厂模式的优势。