設計模式之工廠模式(Factory Pattern)
阿新 • • 發佈:2018-12-17
工廠模式在我們平時工作中還是非常常用的一種模式,它提供了一種建立物件的最佳方式。在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯,並且是通過使用一個共同的介面來指向新建立的物件。
-
工廠模式的定義
Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses。定義一個用於建立物件的介面,讓子類決定例項化哪一個類。工廠方法使一個類的例項化延遲到其子類。 -
工廠模式通用類圖
對上面的類圖簡單的說明:- 工廠介面IFactory用來生產定義產品物件。
- 產品介面IProduct用來定義產品物件的共性。
- 具體的產品類由具體工廠實現類Factory來建立的。
-
工廠模式通用程式碼
public interface IFactory { IProduct createProduct(); } public class Factory implements IFactory { @Override public IProduct createProduct() { return new Product(); } } public interface IProduct { void productMethod(); } public class Product implements IProduct{ @Override public void productMethod() { System.out.println("I'm a product"); } }
測試類:
public class Client {
public static void main(String[] args) {
IFactory f = new Factory();
IProduct p = f.createProduct();
p.productMethod();
}
}
-
通過工廠模式通用類圖可以看到,工廠模式有四個要素:
- 工廠介面。工廠介面是工廠方法模式的核心,與呼叫者直接互動用來提供產品。
- 工廠實現。在程式設計中,工廠實現決定如何例項化產品,是實現擴充套件的途徑,需要有多少種產品,就需要有多少個具體的工廠實現。
- 產品介面。產品介面的主要目的是定義產品的規範。
- 產品實現。實現產品介面的具體類,決定了產品在客戶端中的具體行為。
-
工廠模式例項
- 例項類圖
- 例項程式碼
- 例項類圖
public interface IShape {
void draw();
}
public class Circle implements IShape{
@Override
public void draw() {
System.out.println("This's Circle");
}
}
public class Square implements IShape{
@Override
public void draw() {
System.out.println("This's Square");
}
}
public class Rectangle implements IShape{
@Override
public void draw() {
System.out.println("This's Rectangle");
}
}
public interface ShapeFactory {
IShape getShape(String shape);
}
public class Factory implements ShapeFactory {
@Override
public IShape getShape(String shape) {
if (shape.equals("Circle")) {
return new Circle();
}
if (shape.equals("Square")) {
return new Square();
}
if(shape.equals("Rectangle")){
return new Rectangle();
}
return null;
}
}
public class Client {
public static void main(String[] args) {
ShapeFactory a = new Factory();
IShape b = a.getShape("Rectangle");
b.draw();
}
}
- 工廠模式帶來的好處
- 良好的封裝性,程式碼結構清晰,降低模組間的耦合度。比如一個呼叫者需要建立一個具體的產品物件,只需要知道這個產品的類名就可以了。
- 可擴充套件性很好。
- 符合迪米特法則和依賴倒置原則。
參考書籍:設計模式之禪
,Head First設計模式
例項程式碼放在這裡。