創建型模式#
創建型模式:就是創建對象的模式,抽象了實例化的過程。關注的是對象的創建,創建型模式將創建對象的過程進行抽象,可以理解為將創建對象進行了封裝,作為客戶程序只需使用對象,不再關心創建對象過程的邏輯。
簡單工廠模式#
簡單工廠模式 (Simple Factory Pattern):又稱為靜態工廠方法 (Static Factory Method) 模式,在簡單工廠模式中,可以根據參數的不同返回不同類的實例(一個按鈕根據形狀參數返回不同的形狀)。簡單工廠模式專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。
實現方法#
-
工廠類(Factory):負責根據傳入參數(如字符串、枚舉等)創建對應的產品對象。
public class VendorFactory { public static IVender createVendor(String type) { switch (type) { case "A": return new VendorA(); case "B": return new VendorB(); default: throw new RuntimeException("供應商不存在"); } } }
-
抽象產品(Abstract Product):定義所有產品的公共接口。
public interface IVender { void order(); }
-
具體產品(Concrete Product):實現抽象產品接口的類,每個類對應一種產品類型。
public class VendorA implements IVender { @Override public void order() { System.out.println("A供應商下單成功"); } }
使用#
IVender vendor = VendorFactory.createVendor("A");
vendor.order(); // 輸出:A供應商下單成功
工廠方法模式#
核心思想是將對象的創建過程抽象化,允許子類決定實例化哪個具體類,從而在不修改客戶端代碼的情況下擴展系統功能。
組成部分#
- 抽象工廠(Creator)
- 具體工廠(Concrete Creator)
- 抽象產品(Product)
- 具體產品(Concrete Product)
實現#
// 抽象產品
interface Car {
void show();
}
// 具體產品
class CarA implements Car {
@Override
public void show() { System.out.println("小米SU7"); }
}
// 抽象工廠
abstract class Factory {
public abstract Car createCar();
}
// 具體工廠
class CarFactoryA extends Factory {
@Override
public Car createCar() { return new CarA(); }
}
實現方法#
-
工廠類(Factory):負責根據傳入參數(如字符串、枚舉等)創建對應的產品對象。
public class VendorFactory { public static IVender createVendor(String type) { switch (type) { case "A": return new VendorA(); case "B": return new VendorB(); default: throw new RuntimeException("供應商不存在"); } } }
-
抽象產品(Abstract Product):定義所有產品的公共接口。
public interface IVender { void order(); }
-
具體產品(Concrete Product):實現抽象產品接口的類,每個類對應一種產品類型。
public class VendorA implements IVender { @Override public void order() { System.out.println("A供應商下單成功"); } }
使用#
IVender vendor = VendorFactory.createVendor("A");
vendor.order(); // 輸出:A供應商下單成功
工廠方法模式#
核心思想是將對象的創建過程抽象化,允許子類決定實例化哪個具體類,從而在不修改客戶端代碼的情況下擴展系統功能。
組成部分#
- 抽象工廠(Creator)
- 具體工廠(Concrete Creator)
- 抽象產品(Product)
- 具體產品(Concrete Product)
實現#
// 抽象產品
interface Car {
void show();
}
// 具體產品
class CarA implements Car {
@Override
public void show() { System.out.println("小米SU7"); }
}
// 抽象工廠
abstract class Factory {
public abstract Car createCar();
}
// 具體工廠
class CarFactoryA extends Factory {
@Override
public Car createCar() { return new CarA(); }
}
抽象工廠模式#
一般情況下,一個具體工廠中只有一個工廠方法或者一組重載的工廠方法。但是有時候我們需要一個工廠可以提供多個產品對象,而不是單一的產品對象。
應用條件
當系統所提供的工廠所需生產的具體產品並不是一個簡單的對象,而是多個位於不同產品等級結構中屬於不同類型的具體產品時需要使用抽象工廠模式。
工廠方法模式針對的是一個產品等級結構,而抽象工廠模式則需要面對多個產品等級結構,一個工廠等級結構可以負責多個不同產品等級結構中的產品對象的創建。當一個工廠等級結構可以創建出分屬於不同產品等級結構的產品族中的所有對象時,抽象工廠模式比工廠方法模式更為簡單、有效率。
模式結構#
- AbstractFactory:抽象工廠
- ConcreteFactory:具體工廠
- AbstractProduct:抽象產品
- Product:具體產品
[示例](抽象工廠模式(通俗易懂)_抽象工廠 通俗的方式 - CSDN 博客)
原型模式#
通過複製現有對象(原型)來創建新對象,而非通過傳統的構造函數實例化。它特別適用於需要高效創建複雜對象或動態生成同類對象的場景。
組成#
- 抽象原型(Prototype):定義克隆方法的接口(如
Cloneable
接口)。 - 具體原型(Concrete Prototype):實現克隆邏輯的具體對象(如重寫
clone()
方法)。 - 客戶端(Client):通過調用原型對象的克隆方法創建新對象。
克隆方式:淺拷貝,深拷貝(受到實現或通過序列化)。
實現#
// 抽象原型(實現Cloneable接口)
public abstract class Shape implements Cloneable {
protected String type;
public abstract void draw();
@Override
public Shape clone() {
try {
return (Shape) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError(); // 不會發生
}
}
}
// 具體原型:圓形
public class Circle extends Shape {
public Circle() {
type = "Circle";
}
@Override
public void draw() {
System.out.println("繪製圓形");
}
}
// 客戶端調用
Shape original = new Circle();
Shape clone = original.clone(); // 克隆對象
clone.draw(); // 輸出:繪製圓形
單例模式#
確保一個類在整個應用程序生命週期中只有一個實例,並提供一個全局訪問點。通過單例模式,可以避免多個實例帶來的資源浪費和數據不一致問題。
如何保證只有一個單例:
讓類自身負責保存它的唯一實例。這個類可以保證沒有其他實例被創建,並且它可以提供一個訪問該實例的方法。這就是單例模式的模式動機。
實現方法#
懶漢式(第一次調用時才會被創建)
public class Singleton {
private static Singleton instance;
private Singleton() {
// 私有構造函數
}
public static Singleton getInstance() {
if (instance == null) { // 第一次檢查
instance = new Singleton();
}
return instance;
}
}
餓漢式(類加載時就創建實例)
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {
// 私有構造函數
}
public static Singleton getInstance() {
return instance;
}
}