策略模式&簡單工廠模式&抽象工廠模式


無論工廠還是策略模式,每個具體工具類(工廠模式)/具體策略類(策略模式)中執行方法名都是一樣的,都和抽象工具(工廠模式)/抽象策略(策略模式)中方法名一樣的

1、簡單工廠類

  思想:將創建何種工具交由工廠。將原本邏輯if...else...中“變”的部分抽離為具體工具類,調用方通過在工廠中傳入標志符來確定創建何種工具  

  結構圖: 

          

  

  代碼實現:

  抽象工具類: 

public abstract class FAbsStep {
    public abstract void run();
}

 

 

  具體工具類: 

public class FBanmaStep extends FAbsStep{
    public void run() {
        System.out.println("斑馬編譯步驟開始執行");
        System.out.println("斑馬編譯步驟...");
        System.out.println("斑馬編譯步驟執行結束");
    }
}


public class FshangqiStep extends FAbsStep{
    public void run() {
        System.out.println("上汽編譯步驟開始執行");
        System.out.println("上汽編譯步驟...");
        System.out.println("上汽編譯步驟執行結束");
    }
}

 

  工廠類:用於創建具體工具(通過傳入string類型標志位來判斷創建何種工具)

public class Ffactory {
    public FAbsStep getStep(String name) {  //①通過name來判斷創建何種具體工具  ②返回抽象產品結果
        if(name.equals("banma")) {
            return new FBanmaStep();
        }else {
            return new FshangqiStep();
        }
    }
}

 

  main方法

public class Fmain {
    public static void main(String[] args) {
        Ffactory tfactory=new Ffactory();
        FAbsStep step=tfactory.getStep("shangqi"); //創建出具體工具實例
        step.run();  //執行具體實例方法
    }
}

 

  

2、策略模式

  思想:根據傳入何種策略具體執行對應行為

  結構圖:

  

  

  代碼實現:

  抽象策略:

public abstract class TAbsStep {
    public abstract void run();
}

 

  具體策略: 

public class TBanmaStep extends FAbsStep{
    public void run() {
        System.out.println("斑馬編譯步驟開始執行");
        System.out.println("斑馬編譯步驟...");
        System.out.println("斑馬編譯步驟執行結束");
    }
}

public class TshangqiStep extends FAbsStep{
    public void run() {
        System.out.println("上汽編譯步驟開始執行");
        System.out.println("上汽編譯步驟...");
        System.out.println("上汽編譯步驟執行結束");
    }
}

 

  環境類:抽象策略類作為成員變量,接收具體策略 

//TEnvironment環境類,用戶傳入具體策略類名進而執行具體策略
public class TEnvironment {  
    private FAbsStep fAbsStep;  //抽象策略   策略類作為環境類的成員變量
    public TEnvironment(FAbsStep fAbsStep) { //環境類構造方法,抽象策略作為形參 this.fAbsStep=fAbsStep;
    }
    public void exec() {
        fAbsStep.run();
    }
}

 

  main類:

public class Tmain {
    public static void main(String[] args) {
        TEnvironment tEnvironment = new TEnvironment(new TshangqiStep()); //環境類傳入具體策略方法,用來執行對應策略方法
        tEnvironment.exec();
    }
}

 

 

 

簡單工廠VS策略

1.首先看一下接收的參數:簡單工廠類中的Ffactory.getStep() 方法接收的是字符串,返回的是一個 FAbsStep(抽象工廠類)對象;而 策略模式Environment 類初始化時需要接收一個 new TshangqiStep()(具體策略類)對象。 

2.簡單工廠類中是根據接收的條件創建一個相應的對象,而 Context 類接收的是一個對象,可以調用方法去執行此對象的方法

 

總結簡單工廠模式和策略模式
1.從類型上說:簡單工廠模式屬於創建型模式,而策略模式屬於行為型模式。
2.接下來,看一個小例子:

 斧子有很多種,有一個工廠專門負責生產各種需求的斧子。

工廠模式:
1)根據你給出的目的來生產不同用途的斧子,例如要砍人,那么工廠生產砍人斧子,要伐木就生產伐木斧子。
2)即根據你給出一些屬性來生產不同行為的一類對象返回給你。
3)關注對象創建
策略模式:
1)用工廠生產的斧子來做對應的事情,例如用砍人的斧子來砍人,用伐木的斧子來伐木。
2)即根據你給出對應的對象來執行對應的方法。
3)關注行為的選擇
3.簡單工廠模式:根據客戶選擇的條件,來幫客戶創建一個對象。
 策略模式:客戶給它一個創建好的對象,它來幫客戶做相應的事

 

 

三、抽象工廠模式

結構圖:

 

簡單工廠模式中工廠類代碼中存在很多業務邏輯:

public class Ffactory {
    public FAbsStep getStep(String name) {  //通過name來判斷創建何種具體工具
        if(name.equals("banma")) {
            return new FBanmaStep();
        }else {
            return new FshangqiStep();
        }
    }
}

 

抽象工廠將簡單工廠中工廠類業務代碼抽離實現。具體邏輯如下

業務邏輯:肯德基和麥當勞都有漢堡和可樂產品,現需要針對不同客戶要求,生產不同品牌的產品

 

抽象產品類

//抽象漢堡產品
public interface IHumburg {
    public HumburgDto getHumberDes();
}


//抽象可樂產品
public interface ICole {
    public ColeDto getCole();
}

 

 

具體產品類

//肯德基勞可樂
public class KfcCole implements ICole {

    @Override
    public ColeDto getCole() {
        ColeDto coleDto=new ColeDto();
        coleDto.setIsIce(false);
        coleDto.setName("肯德基可樂");
        coleDto.setPrize(12);
        coleDto.setSize('M');
        
        return coleDto;
    }

}

//肯德基漢堡
public class KfcHumburge implements IHumburg {

    @Override
    public HumburgDto getHumberDes() {
        HumburgDto humburgDto=new HumburgDto();
        humburgDto.setName("肯德基漢堡");
        humburgDto.setPrice(26);
        humburgDto.setSize('M');
        return humburgDto;
    }

}

//麥當勞可樂
public class McCole implements ICole {

    @Override
    public ColeDto getCole() {
        ColeDto coleDto=new ColeDto();
        coleDto.setIsIce(true);
        coleDto.setName("麥當勞可樂");
        coleDto.setPrize(10);
        coleDto.setSize('L');
        
        return coleDto;
    }

}

//麥當勞漢堡
public class McHumburge implements IHumburg {

    @Override
    public HumburgDto getHumberDes() {
        HumburgDto humburgDto=new HumburgDto();
        humburgDto.setName("麥當勞漢堡");
        humburgDto.setPrice(22);
        humburgDto.setSize('L');
        return humburgDto;
    }

}

 

 

抽象工廠類  --生產抽象產品

public interface IFactory {
    public IHumburg getHumbuger();
    public ICole getCole();
}

 

 

具體工廠類 --生產具體產品

//肯德基工廠
public class KfcFactory implements IFactory {

    public IHumburg getHumbuger() {
        return new KfcHumburge();
    }

    @Override
    public ICole getCole() {
        // TODO Auto-generated method stub
        return new KfcCole();
    }
    

}

//麥當勞產品
public class McFactory implements IFactory {

    public IHumburg getHumbuger() {
        return new McHumburge();
    }

    @Override
    public ICole getCole() {
        // TODO Auto-generated method stub
        return new McCole();
    }
    

}

 

測試類

public class Test {

    public static void main(String[] args) {
        IFactory kfcFactory=new KfcFactory(); //測試代碼中直接創建對應產品工廠,而無需在工廠類中通過業務代碼判斷
        IHumburg kfcHumbuger=kfcFactory.getHumbuger();
        ICole kfcCole=kfcFactory.getCole();
        System.out.println(JSON.toJSONString(kfcHumbuger)+" "+JSON.toJSONString(kfcCole));
        
        IFactory McFactory=new McFactory();
        IHumburg mcHumbuger=McFactory.getHumbuger();
        ICole mcCole=McFactory.getCole();
        System.out.println(JSON.toJSONString(mcHumbuger)+" "+JSON.toJSONString(mcCole));
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM