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