美文网首页Java码农的世界MyBatis+SpringMVC+SpringBoot
Java设计模式--工厂方法模式FactoryMethod

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

作者: 一觉睡到丶小时候 | 来源:发表于2019-10-25 10:34 被阅读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;
    }
    
}

工厂方法模型的优点

  • 更加符合开闭原则,新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可
  • 不使用静态工厂方法,可以形成基于继承的等级结构,简单工厂模式的工厂类使用静态工厂方法
  • 具有良好的封闭性和可扩展性,代码的结构更加清晰

工厂方法模型的缺点

  • 增加新产品类型时,除了增加新产品类,还需要增加具体的工厂类,使得系统类的数目成对增加,一定程度上增加了系统的复杂度
  • 虽然保证了工厂方法内的对修改关闭,但对于使用工厂方法的类,如果要更换另外一种产品,仍然需要修改实例化的具体工厂类

相关文章

网友评论

    本文标题:Java设计模式--工厂方法模式FactoryMethod

    本文链接:https://www.haomeiwen.com/subject/thnjvctx.html