本人所學設計模式皆出自於 結城浩先生的《圖解設計模式》。
類圖
爲什麼使用工廠模式
在工廠模式中,父類決定實例生成的方式,但不決定所要生成的具體類,具體的處理全部交給子類。這樣就可以將生成實例的框架和實際負責生成實例的類解耦。
示例代碼
package com.qiang.framework;
/**
* 抽象工廠
*
* @author zhangxinqiang
* @date 01/04/2018
*/
public abstract class Factory {
/**
* 模板模式調用 用來常見一個產品,並且加入工廠記錄
*
* @param owner 根據自己所需隨意增加參數
* @return 創建的產品
*/
public final Product create(String owner) {
Product product = createProduct(owner);
registerProduct(product);
return product;
}
/**
* 創建商品的抽象方法
*
* @param owner 根據自己所需隨意增加參數
* @return 產品
*/
protected abstract Product createProduct(String owner);
/**
* 註冊商品的抽象方法
*
* @param product 當前創建的產品
*/
protected abstract void registerProduct(Product product);
}
package com.qiang.framework;
/**
* 抽象產品
*
* @author zhangxinqiang
* @date 01/04/2018
*/
public abstract class Product {
/**
* 產品應有的共性功能
*/
public abstract void use();
}
package com.qiang.factory;
import com.qiang.framework.Product;
/**
* 產品-身份證
*
* @author zhangxinqiang
* @date 01/04/2018
*/
public class IdCard extends Product {
private String owner;
public IdCard(String owner) {
System.out.println("正在生產:" + owner + " 的身份證");
this.owner = owner;
}
@Override
public void use() {
System.out.println(owner + "的身份證正在被使用");
}
public String getOwner() {
return owner;
}
}
package com.qiang.factory;
import com.qiang.framework.Factory;
import com.qiang.framework.Product;
import java.util.ArrayList;
import java.util.List;
/**
* 用來生產身份證的工廠
*
* @author zhangxinqiang
* @date 01/04/2018
*/
public class IdCardFactory extends Factory {
private List<IdCard> owner = new ArrayList<>();
@Override
protected Product createProduct(String owner) {
return new IdCard(owner);
}
@Override
protected void registerProduct(Product product) {
owner.add((IdCard) product);
}
}
package com.qiang;
import com.qiang.factory.IdCardFactory;
import com.qiang.framework.Factory;
import com.qiang.framework.Product;
/**
* 測試類
*
* @author zhangxinqiang
* @date 01/04/2018
*/
public class Test {
public static void main(String[] args) {
Factory idCardFactory = new IdCardFactory();
Product product = idCardFactory.create("張三");
product.use();
Product lisi = idCardFactory.create("李四");
lisi.use();
}
}
結果
正在生產:張三 的身份證
張三的身份證正在被使用
正在生產:李四 的身份證
李四的身份證正在被使用