1. 程式人生 > 實用技巧 >[國家集訓隊]Banner

[國家集訓隊]Banner

工廠模式

概述:

  工廠模式具體包括了簡單工廠、工廠方法、抽象工廠,它們是按照從簡單到複雜的順序排列的,屬於設計模式中的建立型,其中簡單工廠並不屬於GOF的23中模式。但是它是理解其它的工廠模式的一個很好的基礎,所以很多人在講述設計模式的時候會提到簡單工廠模式。建立型模式關注的是物件的建立,建立型模式將建立物件的過程進行了抽象,也可以理解為將建立物件的過程進行了封裝,作為客戶程式僅僅需要去使用物件,而不再關心建立物件過程中的邏輯。

定義:定義一個用於建立物件的介面,讓子類決定例項化哪一個類。工廠方法使一個類的例項化延遲到其子類。

Product為抽象產品類負責定義產品的共性,實現對事物最抽象的定義;

Creator為抽象建立類,也就是抽象工廠,具體如何建立產品類是由具體的實現工廠ConcreteCreator完成的。

面向物件設計的六大基本原則:

  SRP(單一職責原則,Single Responsibility Principle):就一個類而言,應該僅有一個引起它變化的原因。簡單來說,一個 類中應該是一組相關性很高的函式、資料的封裝。

  OCP(開閉原則,Open-Closed Principle):一個軟體的實體應當對擴充套件開放,對修改關閉

LSP(裡式替換原則,Liskov Substitution Principle):所有引用基類的地方必須能透明地使用其子類的物件。通俗點講,只要 父類能出現的地方子類就可以出現,而且替換為子類也不會產生任何錯誤或異常,使用者可能根本就不需要知道是父類 還是子類。但是,反過來就不行了,有子類出現的地方,父類未必就能適應。

 DIP(依賴倒轉原則,Dependence Inversion Principle):要針對介面程式設計,不要針對實現程式設計

 ISP(介面隔離原則,Interface Segregation Principles):客戶端不應該依賴它不需要的介面

LoD(迪米特法則,Law of Demeter):只與你直接的朋友通訊,而避免和陌生人通訊


工廠模式的意義:便於拓展,易於維護

具體工廠類程式碼:

實現圖:

1 simpleFactory簡單工廠 建立Shape介面(Shape.cs)

public interface Shape {
    void draw();
}

2simpleFactory簡單工廠 "圓" 建立(Circle.cs)

/*
圓
 */
public class Circle implements   Shape {

    public Circle() {
        System.out.println(" a Circle");
    }

    @Override
    public void draw() {
        System.out.println(" Draw a Circle ");
    }
}

3simpleFactory簡單工廠 "正方形" 建立(Square.cs)

/*
正方形
 */

public class Square implements Shape {
    public Square() {
        System.out.println("Square");
    }

    @Override
    public void draw() {
        System.out.println("Draw Square");
    }
}

4simpleFactory簡單工廠 "長方形" 建立(Rectangle.cs)

/*
長方形
 */
public class Rectangle implements Shape {
    public Rectangle() {
        System.out.println("a Rectangle");
    }
    @Override
    public void draw() {
        System.out.println("Draw a Rectangle");
    }
}

5工廠模式factoryMethod 增加一個工廠介面:(Factory.cs)

package Factory.factoryMethod;

import Factory.simpleFactory.Shape;

public interface  Factory {
    public Shape getShape();
}

6.1工廠模式factoryMethod增加相關工廠類(圓形):

圓形工廠類

package Factory.factoryMethod;
import Factory.simpleFactory.Circle;
import Factory.simpleFactory.Shape;

public class CircleFactory  implements Factory{

    @Override
    public Shape getShape() {

        return new Circle();
    }
}

6.2工廠模式factoryMethod增加相關工廠類(長方形):

長方形工廠類

import Factory.simpleFactory.Circle;
import Factory.simpleFactory.Rectangle;
import Factory.simpleFactory.Shape;

public class RectangleFactory implements Factory {
    @Override
    public Shape getShape() {
        return new Rectangle();
    }
}

6.3工廠模式factoryMethod增加相關工廠類(正方形):

正方形工廠類

import Factory.simpleFactory.Rectangle;
import Factory.simpleFactory.Shape;
import Factory.simpleFactory.Square;

public class SquareFactory implements Factory {
    @Override
    public Shape getShape() {
        return new Square();
    }
}

7測試:

import Factory.simpleFactory.Shape;

public class TestFactoryMethod {
public static void main(String[] args)
{
Factory circleFactory=new RectangleFactory();
Shape circle = circleFactory.getShape();
circle.draw();
}
}

結果:

a Rectangle
Draw a Rectangle

簡單工廠模式:

一個模組僅需要一個工廠類,沒有必要把它產生出來,使用靜態的方法

多個工廠類:

每個人種(具體的產品類)都對應了一個建立者,每個建立者獨立負責建立對應的產品物件,非常符合單一職責原則

代替單例模式:

單例模式的核心要求就是在記憶體中只有一個物件,通過工廠方法模式也可以只在記憶體中生產一個物件

延遲初始化:

ProductFactory負責產品類物件的建立工作,並且通過prMap變數產生一個快取,對需要再次被重用的物件保留

使用場景:jdbc連線資料庫,硬體訪問,降低物件的產生和銷燬