[國家集訓隊]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連線資料庫,硬體訪問,降低物件的產生和銷燬