| 定義:定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪一個(gè)類。工廠方法使一個(gè)類的實(shí)例化延遲到其子類。 結(jié)構(gòu):(書(shū)中圖,侵刪)
 一個(gè)工廠的抽象接口 若干個(gè)具體的工廠類 一個(gè)需要?jiǎng)?chuàng)建對(duì)象的抽象接口 若干個(gè)所需創(chuàng)建的對(duì)象的類 較之簡(jiǎn)單工廠方法,多了一層抽象——將工廠也抽象了;由原來(lái)的一個(gè)萬(wàn)能工廠變?yōu)楝F(xiàn)在的若干個(gè)各司其職的工廠。    導(dǎo)致的結(jié)果就是:原本新增一個(gè)要?jiǎng)?chuàng)建的對(duì)象需要直接修改萬(wàn)能工廠類,增加判斷,違反了開(kāi)放-封閉原則; 現(xiàn)在工廠相關(guān)代碼不用改,只需要新增工廠類即可,同時(shí)將判斷轉(zhuǎn)移給了客戶端。 實(shí)例:既然是和簡(jiǎn)單工廠相對(duì)比,就還是延用之前計(jì)算器的例子:(同樣,為了代碼簡(jiǎn)潔不考慮輸入不合法等代碼健壯性) 抽象工廠接口: package designpattern.factorymethod; import designpattern.staticfactorymethod.Calculate; public interface CalculateFactory { Calculate create(); } 若干工廠接口: 加 package designpattern.factorymethod; import designpattern.staticfactorymethod.Calculate; import designpattern.staticfactorymethod.Plus; public class PlusFactory implements CalculateFactory{ @Override public Calculate create() { return new Plus(); } }   package designpattern.factorymethod; import designpattern.staticfactorymethod.Calculate; import designpattern.staticfactorymethod.Minus; public class MinusFactory implements CalculateFactory { @Override public Calculate create() { return new Minus(); } }   package designpattern.factorymethod; import designpattern.staticfactorymethod.Calculate; import designpattern.staticfactorymethod.Multiply; public class MultiplyFactory implements CalculateFactory { @Override public Calculate create() { return new Multiply(); } }   package designpattern.factorymethod; import designpattern.staticfactorymethod.Calculate; import designpattern.staticfactorymethod.Divide; public class DivideFactory implements CalculateFactory { @Override public Calculate create() { return new Divide(); } } 抽象計(jì)算類及若干具體計(jì)算類:(延用之前簡(jiǎn)單工廠方法的代碼) 抽象類: package designpattern.staticfactorymethod; public abstract class Calculate { public double num1; public double num2; Calculate() { } Calculate(double num1, double num2) { this.num1 = num1; this.num2 = num2; } public abstract double calculate(); } 加: package designpattern.staticfactorymethod; public class Plus extends Calculate { public Plus() { } Plus(double num1, double num2) { super(num1, num2); } @Override public double calculate() { return num1 + num2; } }   package designpattern.staticfactorymethod; public class Minus extends Calculate { public Minus() { } Minus(double num1, double num2) { super(num1, num2); } @Override public double calculate() { return num1 - num2; } }   package designpattern.staticfactorymethod; public class Multiply extends Calculate { public Multiply() { } Multiply(double num1, double num2) { super(num1, num2); } @Override public double calculate() { return num1 * num2; } }   package designpattern.staticfactorymethod; public class Divide extends Calculate { public Divide() { } Divide(double num1, double num2) { super(num1, num2); } @Override public double calculate() { return num1 / num2; } } 客戶端: package designpattern.factorymethod; import java.util.Scanner; import designpattern.staticfactorymethod.Calculate; public class Client { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("請(qǐng)輸入一個(gè)數(shù)字"); double num1 = scanner.nextDouble(); System.out.println("請(qǐng)輸入一個(gè)運(yùn)算符:+、-、*、/"); String operator = scanner.next();// 不能用nextLine(),會(huì)把上一個(gè)回車給吸收 System.out.println("請(qǐng)輸入一個(gè)數(shù)字"); double num2 = scanner.nextDouble(); CalculateFactory calculateFactory = null; switch (operator) { case "+": calculateFactory = new PlusFactory(); break; case "-": calculateFactory = new MinusFactory(); break; case "*": calculateFactory = new MultiplyFactory(); break; case "/": calculateFactory = new DivideFactory(); break; default: break; } Calculate calculate = calculateFactory.create(); calculate.num1 = num1; calculate.num2 = num2; System.out.println(calculate.calculate()); scanner.close(); } } 總結(jié):工廠方法模式就是在簡(jiǎn)單工廠方法模式的基礎(chǔ)上進(jìn)一步抽象,使其符合開(kāi)放-封閉原則。 個(gè)人理解,在輕量級(jí)系統(tǒng),或者工廠所能創(chuàng)建的東西較少可能修改的情況下,可以考慮使用簡(jiǎn)單工廠模式; 否則,需要使用工廠方法模式。 
 | 
|  |