無論工廠還是策略模式,每個具體工具類(工廠模式)/具體策略類(策略模式)中執行方法名都是一樣的,都和抽象工具(工廠模式)/抽象策略(策略模式)中方法名一樣的
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)); } }