應用最廣泛的模式——工廠方法模式
阿新 • • 發佈:2019-01-12
背景
工廠方法是建立型設計模式之一,工廠方法模式是一種結構簡單的模式,在我們的開發之中應用十分廣泛,作為一個java程式設計師,我們實在有必要去深入理解
一、工廠方法模式定義
定義一個用於建立物件的介面,讓子類決定例項化哪個類
工廠化方法模式在任何需要生成複雜的物件適合使用工廠模式,用new就可以建立的物件無須使用工廠模式
二、普通工廠方法模式
public abstract class Product {
/**
* 產品類的抽象方法
* 由具體產品類去實現
*/
public abstract void mothod();
}
public class ConcreteProductA extends Product{
@Override
public void mothod() {
// TODO 自動生成的方法存根
System.out.println("我是具體產品A");
}
}
public class ConcreteProductB extends Product{
@Override
public void mothod() {
// TODO 自動生成的方法存根
System.out.println("我是具體產品B" );
}
}
public abstract class Factory {
/**
* 抽象工廠方法 具體產品讓子類去實現
*/
public abstract Product createProduct();
}
public class ConcreteProductA extends Product{
@Override
public void mothod() {
// TODO 自動生成的方法存根
System.out.println("我是具體產品A");
}
}
public class Client {
public static void main(String[] args) {
ConcreteFactory concreteFactory = new ConcreteFactory();
Product p = concreteFactory.createProduct();
p.mothod();
}
}
這裡的幾個角色很簡單,主要分為四大模組,一是抽象工廠,其為工廠方法模式的核心,二是具體工廠,其實現了具體的業務邏輯,三是抽象產品,是工廠方法模式所建立的產品的父類,四是具體產品,為實現抽象產品的某個具體產品物件。
上訴的程式碼中我們在Client類中構建了一個工廠物件,並通過其生產了一個產品物件,這裡我們得到的產品物件是ConcreateProdcutA的例項,如果想得到ConcreateProdcutB的例項,更改ConcreteFactory中的邏輯即可。
三、反射呼叫工廠模式
除了上述的方式使用工廠模式,比較常用的還有通過反射來會更加簡潔來生產具體產品物件,此時,需要在工廠方法中傳入一個方法的引數class類來決定是生產哪一個產品類
public abstract class Factory2 {
public abstract <T extends Product> T createProduct(Class<T> clz);
}
public class ConcreteFactory2 extends Factory2{
@Override
public <T extends Product> T createProduct(Class<T> clz) {
// TODO 自動生成的方法存根
Product product=null;
try {
product = (Product) Class.forName(clz.getName()).newInstance();
} catch (InstantiationException | IllegalAccessException
| ClassNotFoundException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
}
return (T)product;
}
}
需要哪個類的物件就傳入哪個類的型別即可,這種方法比較簡潔、動態,如果你不喜歡這種方式,也可以嘗試為每個產品都定義一個具體的工廠,各司其職。
四、靜態工廠模式
public class StaticFactory {
public static Product createProduct(){
return new ConcreteProductA();
}
}