工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一,這種型別的設計模式屬于創建型模式,它提供了一種創建物件的最佳方式,
在工廠模式中,我們在創建物件時不會對客戶端暴露創建邏輯,并且是通過使用一個共同的介面來指向新創建的物件,
介紹
意圖:定義一個創建物件的介面,讓其子類自己決定實體化哪一個工廠類,工廠模式使其創建程序延遲到子類進行,
主要解決:主要解決介面選擇的問題,
何時使用:我們明確地計劃不同條件下創建不同實體時,
如何解決:讓其子類實作工廠介面,回傳的也是一個抽象的產品,
關鍵代碼:創建程序在其子類執行,
應用實體: 1、您需要一輛汽車,可以直接從工廠里面提貨,而不用去管這輛汽車是怎么做出來的,以及這個汽車里面的具體實作, 2、Hibernate 換資料庫只需換方言和驅動就可以,
優點: 1、一個呼叫者想創建一個物件,只要知道其名稱就可以了, 2、擴展性高,如果想增加一個產品,只要擴展一個工廠類就可以, 3、屏蔽產品的具體實作,呼叫者只關心產品的介面,
缺點:每次增加一個產品時,都需要增加一個具體類和物件實作工廠,使得系統中類的個數成倍增加,在一定程度上增加了系統的復雜度,同時也增加了系統具體類的依賴,這并不是什么好事,
使用場景: 1、日志記錄器:記錄可能記錄到本地硬碟、系統事件、遠程服務器等,用戶可以選擇記錄日志到什么地方, 2、資料庫訪問,當用戶不知道最后系統采用哪一類資料庫,以及資料庫可能有變化時, 3、設計一個連接服務器的框架,需要三個協議,"POP3"、"IMAP"、"HTTP",可以把這三個作為產品類,共同實作一個介面,
注意事項:作為一種創建類模式,在任何需要生成復雜物件的地方,都可以使用工廠方法模式,有一點需要注意的地方就是復雜物件適合使用工廠模式,而簡單物件,特別是只需要通過 new 就可以完成創建的物件,無需使用工廠模式,如果使用工廠模式,就需要引入一個工廠類,會增加系統的復雜度,
實作
我們將創建一個 Shape 介面和實作 Shape 介面的物體類,下一步是定義工廠類 ShapeFactory,
FactoryPatternDemo,我們的演示類使用 ShapeFactory 來獲取 Shape 物件,它將向 ShapeFactory 傳遞資訊(CIRCLE / RECTANGLE / SQUARE),以便獲取它所需物件的型別,

C++實作:
步驟 1
創建一個虛函式
Shap.h
#pragma once
class Shap {
public:
Shap(){}
virtual void draw() = 0;
};
步驟 2
創建實作介面的物體類
Circle.h
#pragma once
#include "Shap.h"
#include <iostream>
using namespace std;
class Circle:public Shap {
public:
Circle() {}
virtual void draw() {
std::cout << "system.out.Circle\n";
}
};
Rectangle.h
#pragma once
#include "Shap.h"
#include <iostream>
using namespace std;
class Rectangle :public Shap {
public:
virtual void draw() {
std::cout << "system.out.Rectangle\n";
}
};
Square .h
#pragma once
#include "Shap.h"
#include <iostream>
using namespace std;
class Square :public Shap {
public:
virtual void draw() {
std::cout << "system.out.Square\n";
}
};
步驟 3
創建一個工廠,生成基于給定資訊的物體類的物件,
ShapeFactory.h
#pragma once
#include "Shap.h"
#include "Circle.h"
#include "Rectangle.h"
#include "Square .h"
#include <iostream>
using namespace std;
class ShapeFactory {
public:
Shap* getShap(string shapeType) {
if (shapeType.empty()) {
return nullptr;
}
if (shapeType._Equal("Circle")) {
return new Circle();
}
else if (shapeType._Equal("Rectangle")) {
return new Rectangle();
}
else if (shapeType._Equal("Square ")) {
return new Square();
}
return nullptr;
}
};
步驟 4
使用該工廠,通過傳遞型別資訊來獲取物體類的物件,
main入口
#include <iostream>
#include "ShapeFactory .h"
using namespace std;
int main()
{
ShapeFactory *sf = new ShapeFactory();
sf->getShap("Circle")->draw();
sf->getShap("Rectangle")->draw();
sf->getShap("Square ")->draw();
delete sf;
std::cin.get();
return 0;
}
輸出:
system.out.Circle
system.out.Rectangle
system.out.Square
1.屬于創建型模式 2.創建物件時不會對客戶端暴露創建邏輯 3.通過使用一個共同的介面來指向新創建的物件
Java實作
步驟 1
創建一個介面,
Shape.java
public interface Shape {
void draw();
}
步驟 2
創建實作介面的物體類,
Rectangle.java
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
Square.java
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
Circle.java
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
步驟 3
創建一個工廠,生成基于給定資訊的物體類的物件,
ShapeFactory.java
public class ShapeFactory {
// 使用 getShape 方法獲取形狀型別的物件
public Shape getShape(String shapeType) {
if (shapeType == null) {
return null;
}
if (shapeType.equalsIgnoreCase("CIRCLE")) {
return new Circle();
} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
return new Rectangle();
} else if (shapeType.equalsIgnoreCase("SQUARE")) {
return new Square();
}
return null;
}
}
步驟 4
使用該工廠,通過傳遞型別資訊來獲取物體類的物件,
FactoryPatternDemo.java
public class FactoryPatternDemo {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
// 獲取 Circle 的物件,并呼叫它的 draw 方法
Shape shape1 = shapeFactory.getShape("CIRCLE");
// 呼叫 Circle 的 draw 方法
shape1.draw();
// 獲取 Rectangle 的物件,并呼叫它的 draw 方法
Shape shape2 = shapeFactory.getShape("RECTANGLE");
// 呼叫 Rectangle 的 draw 方法
shape2.draw();
// 獲取 Square 的物件,并呼叫它的 draw 方法
Shape shape3 = shapeFactory.getShape("SQUARE");
// 呼叫 Square 的 draw 方法
shape3.draw();
}
}
步驟 5
驗證輸出,
Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/423304.html
標籤:其他
