Java码农的世界MyBatis+SpringMVC+SpringBoot

Java设计模式--工厂方法模式FactoryMethod

2019-10-25  本文已影响0人  一觉睡到丶小时候

应用场景

通常由应用程序直接使用new创建新的对象,为了将对象的创建和使用相分离,采用工厂模式,即应用程序将对象的创建及初始化职责交给工厂对象。
一般情况下,应用程序有自己的工厂对象来创建Bean.如果将应用程序自己的工厂对象交给Spring管理,那么Spring
管理的就不是普通的Bean,而是工厂Bean。

归类

创建型模式

特点

对于调用者来说,隐藏了复杂的逻辑处理过程,调用者只关心执行结果。
对于工厂来说要对结果负责,保证生产出符合规范的产品。

穷举

流水线生产

工厂方法模式的介绍

工厂方法模型,又称为多态性工厂模型,在工厂方法模型中,核心的工厂类不再负责所有的产品的创建,而是将具体实例化的工作交给了子类完成。该核心工厂类成为一个抽象工厂角色,作用是给具体的工厂子类必须实现的接口,不接触具体实例化哪些产品的细节。

模式组成

模式组成.png 模式组成.png

表述代码

我们先实现抽象产品类Product

public abstract class Product {

    //产品类的公共方法
    public void method1() {
        
    }
    
    public abstract void method2();
}

有了抽象产品类还不行,我们还需要具体的产品ConcreteProduct1:

public class ConcreteProduct1 extends Product {

    public void method2() {
        //业务逻辑处理
        System.out.println("this is product 1...");
    }
}

ConcreteProduct2:

public class ConcreteProduct2 extends Product {

    public void method2() {
        //业务逻辑处理
        System.out.println("this is product 2...");
    }
}

现在我们定义一个抽象的工厂类,让它声明带实现的接口Creator

public abstract class Creator {

    public abstract <T extends Product> T createProduct(Class<T> c);
}

实现具体工厂类ConcreCreator

public class ConcreCreator extends Creator {

    @Override
    public <T extends Product> T createProduct(Class<T> c) {
        // TODO Auto-generated method stub
        Product product = null;
        try {
            product = (Product)Class.forName(c.getName()).newInstance();
        } catch (Exception e) {
            //异常处理
        }
        return (T)product;
    }
}

我们的客户端:

public class Client {

    public static void main(String[] args) {
        Creator creator = new ConcreCreator();
        Product product = creator.createProduct(ConcreteProduct2.class);
        product.method2();
        
        /**
         * 继续业务处理
         */
    }
}

替代单例模式

import java.lang.reflect.Constructor;

public class SingletonFactory {

    private static Singleton singleton;
    
    static {
        try {
            Class c = Class.forName(Singleton.class.getName());
            Constructor constructor = c.getDeclaredConstructor();
            constructor.setAccessible(true);
            singleton = (Singleton)constructor.newInstance();
        } catch (Exception e) {
            //异常处理
        }
    }
    
    public static Singleton getSingleton() {
        return singleton;
    }
}

延迟初始化

什么是延迟初始化?一个对象被消费完毕后,并不立即释放,工厂类保持其初始状态,等待再次被使用,延迟初始化是工厂方法模式的一个扩展应用。


图片.png
public class ProductFactory {

    private static final Map<String, Product> prMap = new HashMap();
    public static synchronized Product createProduct(String type) throws Exception {
        Product product = null;
        if(prMap.containsKey(type)) {
            product = prMap.get(type);
        }
        else {
            if(type.equals("Product1")) {
                product = new ConcreteProduct1();
            }
            else {
                product = new ConcreteProduct2();
            }
            prMap.put(type, product);
        }
        return product;
    }
    
}

工厂方法模型的优点

工厂方法模型的缺点

上一篇 下一篇

猜你喜欢

热点阅读