設計模式 - Factory Method

Factory Method 模式:

  • 父類決定實例的生成方式,但是不決定所要生成的具體的類,具體的處理全部交給子類負責,這樣就可以將生成實例的框架和實際負責生成實例的類解耦。

實例:

  • 模板可以使用兩個抽象類,一個是ProductFactory,一個是Product,只爲簡單模擬,Product接口有作爲一個產品使用的方法use,ProductFactory則是創建產品也就是Product,返回Product實例的方法createProduct,使用create方法來固定生產產品以及註冊產品的步驟,使用了Template模式。
  • 而具體的實現是交給子類去實現的,比如我們要製造Book這個產品,我們需要使用Book來實現Product類,重寫use()方法,符合Book這個產品的使用方式,用BookFactory 來返回Book這個實例。

Product 類:


public abstract class Product {
	private String productName;
	public Product(String productName) {
		this.productName = productName;
	}
	public abstract void use();
}

ProductFactory 類:

public abstract class ProductFactory {
	public abstract Product createProduct(String productName);
	public abstract void registerProduct(Product product);
	public Product create(String productName) {
		Product product = createProduct(productName);
		registerProduct(product);
		return product;
	}
}

Book 類:


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Book extends Product {
	private Logger logger = LoggerFactory.getLogger(Book.class);
	private String bookName;
	Book(String bookName) {
		super(bookName);
		this.bookName = bookName;
	}
	@Override
	public void use() {
		logger.info("You can read {} by yourself",bookName);
	}
	@Override
	public String toString() {
		return "bookName=" + bookName ;
	}
	
}

BookFactory 類:


import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class BookFactory extends ProductFactory{
	private Logger logger = LoggerFactory.getLogger(BookFactory.class);
	private List<Book> bookList = new ArrayList<>();
	@Override
	public Product createProduct(String productName) {
		Book book = new Book(productName);
		return book;
	}
	@Override
	public void registerProduct(Product product) {
		bookList.add((Book) product);
		logger.info("{}",bookList);
	}
	

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章