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);
}
}