【設計模式學習】第三種: FactoryMethod - 工廠方法模式
阿新 • • 發佈:2021-01-23
第三種: FactoryMethod - 工廠方法模式
設計模式真的很不錯!
任何可以產生物件的方法或類都可以成為工廠,單例也是一種工廠。
那麼有了new之後為什麼還要有工廠呢?
第一,我要控制生產過程。第二,我要控制權限,修飾,加些日誌…
下面我們看一個簡單的例子,來引出工廠方法模式。
1. 引例
假設你現在要選擇一種交通工具出門,有三種選擇:car ,plane, broom(掃把)。你該怎麼設計,可以實現任意定製交通工具。在學過策略之後,這個應該很簡單。
public interface Moveable {
public void go ();
}
public class Car implements Moveable{
public void go() {
System.out.println("Car go wuwuwu...");
}
}
public class Plane implements Moveable{
public void go(){
System.out.println("plane flying shuashua...");
}
}
public class Broom implements Moveable{
public void go() {
System.out.println("broom flying chuachua...");
}
}
public class main {
public static void main(String[] args) {
Moveable m = new Broom();
m.go();
}
}
這樣我們想選擇什麼交通工具,就new一個就行了。
2. 如果現在要求你任意定製這個交通工具的生產過程。
除了new外,還能用其他的方法來實現嗎?
當然有,就是工廠,首先讓我們來了解一下簡單工廠:把所有的構造方法都放到一個工廠類中。
/*
* 簡單工廠的可擴充套件性不好
*/
public class SimpleVehicleFactory {
public Car createCar(){
//前置操作,加一些許可權控制。
return new Car();
}
public Broom createBroom(){
return new Broom();
}
public Plane createPlane(){
return new Plane();
}
}
但是,簡單工廠可擴充套件性不好,因為這些操作需要被寫死,而且如果我要新增一種新的交通方式,就需要再在裡面加一個方法。
3. 那麼怎麼讓工廠更加靈活呢?–>使用工廠方法
public interface Moveable {
public void go();
}
public class CarFactory {
public Moveable create(){
System.out.println("a car created!");
return new Car();
}
}
public class PlaneFactory {
public Moveable create(){
System.out.println("a plane created!");
return new Plane();
}
}
public class BroomFactory {
public Moveable create(){
System.out.println("a broom created!");
return new Broom();
}
}
public class main {
public static void main(String[] args) {
Moveable m = new CarFactory().create();
m.go();
}
}
給每一種交通工具做一個工廠類,那麼需要擴充套件時我只需要加一個類就可以了。
這就是工廠方法模式,也不難吧哈哈。下節我們看一個更常用的模式———抽象工廠模式。