1. 程式人生 > >設計模式之Factory工廠模式

設計模式之Factory工廠模式

[] png span over create isp 測試 t對象 es2017

在上一章,模板模式中,我們在父類規定處理的流程,在子類中實現具體的處理。如果我們將該模式用於生成實例,便演變成了Factory模式,即工廠模式。

在Factory模式中,父類決定實例的生成方式,但並不決定所要生成的具體的類,具體處理全部交給子類進行。

設計實例則是模仿Spring框架進行的操作,模擬制作身份證。為了模擬Spring框架解耦,我們采用分包的方法,即生成實例的框架放在framework包中,而加工處理,具體實現的類放在具體實現的idcard包中。

  • framework包中的product類,用於表示產品這一類東西,定義了一個use抽象方法
package site.wangxin520.gof.factory.framework;

/** * 仿spring框架,定義的一個工廠類生產的產品類 * @author wangXgnaw * */ public abstract class Product { /** * 定義一個頂層抽象方法,用於框架中工廠生產的產品,具體實現交給子類 */ public abstract void use(); }
  • framework包中的Factory類
package site.wangxin520.gof.factory.framework;

/**
 * 仿spring框架,建立一個Factory工廠,定義三個方法,具體實現交給子類完成。
 * 這裏采用的是模板方法
 * 
@author wangXgnaw * */ public abstract class Factory { /** * 使用模板方法,具體創建product的實現交給子類 * @param owner 產品所有者姓名 * @return Product */ protected abstract Product createProduct(String owner); /** * 註冊product * @param product */ protected abstract void registerProduct(Product product);
/** * 創建product對象的模板方法 * @param owner 產品所有者姓名 * @return Product */ public final Product create(String owner){ Product p=createProduct(owner); registerProduct(p); return p; } }
  • idcard包中的IDCard類
package site.wangxin520.gof.factory.idcard;

import site.wangxin520.gof.factory.framework.Product;

/**
 * 身份證的實體類
 * @author wangXgnaw
 *
 */
public class IDCard extends Product{

    /**
     * 隱藏IDCard的構造函數,拒絕外部包訪問,外部包只能通過工廠模式進行訪問
     */
    IDCard() {
    }
    
    //IDCard的屬性
    private String owner;
    public String getOwner() {
        return owner;
    }
    public void setOwner(String owner) {
        this.owner = owner;
    }


    @Override
    public void use() {
        System.out.println(owner+"使用了身份證");
    }

}
  • idcard包中的IDCardFactory類
package site.wangxin520.gof.factory.idcard;

import java.security.acl.Owner;
import java.util.ArrayList;
import java.util.List;

import site.wangxin520.gof.factory.framework.Factory;
import site.wangxin520.gof.factory.framework.Product;

/**
 * 創建身份證的工廠
 * @author wangXgnaw
 *
 */
public class IDCardFactory extends Factory {
    
    //記錄登記創建了的產品信息,貌似如果是單例模式的話,就可以直接從這裏取值了,最好是map結構(猜測)
    private List<Product> createdProduct=new ArrayList<Product>();
    
    @Override
    protected Product createProduct(String owner) {
        IDCard idCard=new IDCard();
        idCard.setOwner(owner);
        System.out.println("創建了"+owner+"的身份證");
        return idCard;
    }

    @Override
    protected void registerProduct(Product product) {
        createdProduct.add(product);
    }

}
  • 具體測試類
package site.wangxin520.gof.factory.idcard;

import site.wangxin520.gof.factory.framework.Factory;
import site.wangxin520.gof.factory.framework.Product;

/**
 * 測試工廠類
 * @author wangXgnaw
 *
 */
public class FactoryTest {

    public static void main(String[] args) {
        
        Factory factory=new IDCardFactory();
        
        Product p1 = factory.create("葵司");
        Product p2 = factory.create("上原亞衣");
        Product p3 = factory.create("古川伊織");
        
        p1.use();
        p2.use();
        p3.use();
        
    }
    
}
  • 最終控制臺輸出結果為

技術分享

設計模式之Factory工廠模式