1. 程式人生 > >設計模式之工廠模式(Factory Pattern)

設計模式之工廠模式(Factory Pattern)

工廠模式在我們平時工作中還是非常常用的一種模式,它提供了一種建立物件的最佳方式。在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯,並且是通過使用一個共同的介面來指向新建立的物件。

  • 工廠模式的定義
    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設計模式
例項程式碼放在這裡