1. 程式人生 > >#大話設計模式之工廠方法模式#

#大話設計模式之工廠方法模式#

  說實話,工廠方法模式其實跟簡單工廠模式很相似,就是修復了簡單工廠的一些不符合開閉原則的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特定的物件,呼叫特定的方法;

模式過程:修補了簡單工程模式裡面,需要新增新方法的時候,需要修改原始碼!!違反開閉原則,這裡的措施是,要新增新方法,你就新增個新類吧。