定義:
從設計模式的類型上來說,簡單工廠模式是屬于創建型模式,又叫做靜態工廠方法(Static Factory Method)模式,但不屬于23種GOF設計模式之一。簡單工廠模式是由一個工廠對象決定創建出哪一種產品類的實例。簡單工廠模式是工廠模式家族中最簡單實用的模式,可以理解為是不同工廠模式的一個特殊實現。
其中我們應該注意定義中的一句話 "由一個工廠對象決定創建出哪一類產品實例“
【簡單工廠設計模式】
工廠模式就是專門負責將大量有共同接口的類實例化,而且不必事先知道每次是要實例化哪一個類的模式。它定義一個用于創建對象的接口,由子類決定實例化哪一個類。
類圖:
2017-11-15_204221.png
以上類圖引自百度
通過以上類圖我們不難發現簡單工廠模式總共有三個組件,工廠類(Creator)、產品接口(Iproduct)、具體產品(Pa和Pb)。
這樣的結構我們可以發現,工廠類只有一個,那么就意味著所有的產品都由此工廠創建,所以為了使工廠類能夠知道我們需要哪一種產品,我們需要在創建產品時傳遞給工廠類一個參數,去表明我們想要創建哪種產品。
代碼實現:
定義一個產品接口
public interface class IProduct {
public void action();
}
定義一個產品類(car)
public class Car implements IProduct {
public void action(){
System.out.println("汽車在路上跑!");
}
}
定義一個產品類(airplane)
public class Airplane implements IProduct {
public void action(){
System.out.println("飛機在天上飛!");
}
}
定義一個創建產品的工廠類(所有的產品都從此創建)
public class Factory {
private Factory(){}
public static IProduct creatProduct(String type){
if("Car".equals(type)){
return new Car();
}else if("Airplane".equals(type)){
return new Airplane();
}else{
return null;
}
}
}
測試類
public class App {
public static void main(String[] args) {
IProduct Car= Factory.createProduct("Car");
car.action();
IProduct airplane = Factory.createProduct("Airplane");
airplane .action();
}
}
2017-11-16_103814.png
2017-11-16_113957.png
注解:
1、所有產品都實現一個產品接口,按照特性重寫方法
2、所有產品由工廠類直接創建(所以,工廠在創建時要知道你叫我創建什么產品,即工廠的創建方法需要調用者傳一個產品type的參數)
缺點:
每當需要增加新產品創建的時候,都要改變工廠類,不利于維護
實際案例:
還記得我們在學完servlet后做的第一個登陸注冊系統嗎?一個servlet實現一個功能,這里就不細講了,直接用我們最簡單的工廠模式去改造它!
#1 首先我們必須要一個servlet接口(類似于產品接口一樣,而這里具體的servlet則是具體產品)
interface Servlet{}
#2 相當于簡單工廠模式中的抽象父類產品。
//注意,簡單工廠在網絡上的資料大部分為了簡單容易理解都是只規劃了一個產品接口,但這不代表就只能有一個,設計模式的使用要靈活多變。
class HttpServlet implements Servlet{}
#3 具體的產品
class LoginServlet extends HttpServlet{}
class RegisterServlet extends HttpServlet{}
class LoginoutServlet extends HttpServlet{}
#4 產品工廠
public class ServletFactory {
private ServletFactory(){}
//典型的創造產品的方法,一般是靜態的,因為工廠不需要有狀態。
public static Servlet createServlet(String servletName){
if (servletName.equals("login")) {
return new LoginServlet();
}else if (servletName.equals("register")) {
return new RegisterServlet();
}else if (servletName.equals("loginout")) {
return new LoginoutServlet();
}else {
throw new RuntimeException();
}
}
}
以上就是我們最初在web服務中用的簡單工廠模式
2017-11-16_111927.png
總結:
工廠類負責創建的對象比較少;
客戶只知道傳入工廠類的參數(如上例子傳參瀏覽器類型),對于如何創建對象(邏輯)不關心;
由于簡單工廠很容易違反高內聚責任分配原則,因此一般只在很簡單的情況下應用。