设计模式-工厂方法(Factory Method)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-工厂方法(Factory Method)相关的知识,希望对你有一定的参考价值。

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)的主要内容,如果未能解决你的问题,请参考以下文章

Factory Method 工厂方法模式

工厂方法模式-Factory Method

工厂方法模式(Factory Method)

设计模式工厂方法模式(Factory Method)

设计模式——工厂方法模式(Factory Method)

设计模式二: 工厂方法(Factory Method)