#大話設計模式之工廠方法模式#
阿新 • • 發佈:2019-01-09
說實話,工廠方法模式其實跟簡單工廠模式很相似,就是修復了簡單工廠的一些不符合開閉原則的bug,但如果你的專案比較小型,還是推薦簡單工廠來比較簡單方便,畢竟工廠方法還是有美中不足的地方。
現在有一個需求:編寫一個學雷鋒幫助老人的類。
我們使用簡單工廠模式和工廠方法模式寫,兩個區別就在於介面類和工廠類,其餘一樣。
雷鋒父類(包含了雷鋒的方法,掃地,買米... ...)
package FactoryMethodPattern; public class LeiFeng { public void sweep(){ System.out.println("掃地"); } public void wash(){ System.out.println("洗衣服"); } public void buyRice(){ System.out.println("買米"); } }
大學生子類
package FactoryMethodPattern;
public class Undergraduate extends LeiFeng{
}
社群志願者子類(跟大學生一樣的功能,工廠的兩個兩個零件)
package FactoryMethodPattern;
public class Volunteer extends LeiFeng{
}
簡單工廠類(此類最大特點在於裡面使用了switch選擇例項化物件,當需要增加新物件比如“學雷鋒的小學生”我們就需要修改工程類,修改類是違法開閉原則的,所以有問題!)
package FactoryMethodPattern; public class SimpleFactory { public static LeiFeng craeteLeiFeng(String type){ LeiFeng result = new LeiFeng(); switch(type){ case "學雷鋒的大學生": result = new Undergraduate(); break; case "社群志願者": result =new Volunteer(); break; } return result; } }
工廠方法類(對比簡單工廠類,將switch的物件分為不同的類,當需要增加物件時,只需要新增類就好了,符合開閉原則,缺點是增加產品工廠需要額外的開發量。)
package FactoryMethodPattern; public interface IFactory { LeiFeng CreateLieFeng(); } class UndergraduateFactory implements IFactory{ @Override public LeiFeng CreateLieFeng() { // TODO Auto-generated method stub return new Undergraduate(); } } class VolunteerFactory implements IFactory{ @Override public LeiFeng CreateLieFeng() { // TODO Auto-generated method stub return new Volunteer(); } }
介面類(printFrame1是簡單工廠的介面,printFrame2是工廠方法的介面,差不多的)
package FactoryMethodPattern;
public class Main {
public void printFrame1(){
LeiFeng student = SimpleFactory.craeteLeiFeng("學雷鋒的大學生");
student.buyRice();
student.sweep();
student.wash();
}
public void printFrame2(){
IFactory factory = new UndergraduateFactory();
LeiFeng student = factory.CreateLieFeng();
student.buyRice();
student.sweep();
student.wash();
}
public static void main(String[] args) {
Main main = new Main();
main.printFrame1();
System.out.println();
main.printFrame2();
}
}
使用方法:同樣是為了更方便的例項化物件而產生的兩個工廠,工廠方法程式設計風格更優良,但也有美中不足增加開銷的缺點,但還是利大於弊。
Ending... ...
簡單來說:
普通過程:new特定的物件,呼叫特定的方法;
模式過程:修補了簡單工程模式裡面,需要新增新方法的時候,需要修改原始碼!!違反開閉原則,這裡的措施是,要新增新方法,你就新增個新類吧。