log face inf str ace 对象实例 method tee 就是
2018-1-20 by Atlas
应用场景
Template Method Pattern 是在父类建立处理逻辑的大纲骨架,而在子类补充具体的处理内容.把 Template Method Pattern 应用在生成对象实例方面,以 Template Method Pattern 架构获取产生对象实例的工厂,就是 Factory Method Pattern.
UML 类图
Product(产品)参与者
框架的部分.这个抽象类规定此 Pattern 所产生的对象实例应有的接口,具体内容则由子类的 ConcreteProduct 参与者规定.
Creator(生产者)参与者
框架的部分.这是产生 Product 参与者的抽象类.具体的内容由子类的 ConcreteCreator 参与者决定.
Creator 参与者对于实际产生的 ConcreteProduct 参与者完全一无所知.Creator 参与者唯一直到的是只要调用 Product 参与者和产生对象的方法,就能产生 Product.
ConcreteProduct(具体产品)参与者
实际处理内容的部分.规定具体的产品样式.
ConcreteCreator(具体生产者)参与者
实际处理内容的部分.规定制造实际产品的类.
标准示例
public abstract class Product {
public abstract void use();
}
public abstract class Factory {
public final Product create(String owner) {
Product p = createProduct(owner);
registerProduct(p);
return p;
}
protected abstract Product createProduct(String owner);
protected abstract void registerProduct(Product product);
}
public class IDCard extends Product {
private String owner;
public IDCard(String owner){
System.out.println("创建" + owner + "的卡.");
this.owner = owner;
}
public void use() {
System.out.println("使用" + owner + "的卡.");
}
public String getOwner() {
return owner;
}
}
public class IDCardFactory extends Factory {
private Vector<String> owners = new Vector<String>();
protected Product createProduct(String owner) {
return new IDCard(owner);
}
protected void registerProduct(Product product) {
IDCard card = (IDCard) product;
owners.add(card.getOwner());
}
public Vector<String> getOwners() {
return owners;
}
}
Product 定义产品骨架.
Factory 定义工厂生产过程骨架.
IDCard 具体实现产品的内容.
IDCardFactory 具体实现工厂生产 IDCard 对象实例.
案例鉴赏
public class ContextLoader {
protected void configureAndRefreshwebApplicationContext(ConfigurableWebApplicationContext wac, ServletContext sc) {
// ...
wac.refresh();
// ...
}
}
public interface ConfigurableApplicationContext extends ApplicationContext, Lifecycle, Closeable {
// ...
void refresh() throws BeansException, IllegalStateException;
ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException;
// ...
}
public abstract class AbstractApplicationContext extends DefaultResourceLoader
implements ConfigurableApplicationContext, DisposableBean {
// ...
public void refresh() throws BeansException, IllegalStateException {
// ...
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
}
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
refreshBeanFactory();
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
// ...
return beanFactory;
}
public abstract ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException;
// ...
}
public abstract class AbstractRefreshableApplicationContext extends AbstractApplicationContext {
// ...
protected final void refreshBeanFactory() throws BeansException {
// ...
DefaultListableBeanFactory beanFactory = createBeanFactory();
// ...
}
protected DefaultListableBeanFactory createBeanFactory() {
return new DefaultListableBeanFactory(getInternalParentBeanFactory());
}
public final ConfigurableListableBeanFactory getBeanFactory() {
// ...
return this.beanFactory;
}
// ...
}
spring 框架初始化 ApplicationContext 创建 BeanFactory 过程删减后的骨架.
设计模式 - 工厂方法(Factory Method)
来源: http://www.bubuko.com/infodetail-2469168.html