为了账号安全,请及时绑定邮箱和手机立即绑定

设计模式之工厂方法模式

标签:
Java 架构
为什么使用工厂模式?

简单的对象可以直接通过new创建就行,而复杂对象(比如创建对象时需要调用好几个方法时),在许多地方都需要创建时,就需要用到工厂模式了。同时,工厂模式可以实现解耦,高层不直接与产品实现类打交道。

接口

基于依赖倒置原则,我们最好是面向接口编程。工厂方法模式首先需要两个接口:

// 工厂接口
public interface Factory {
    Product create(String productName);
}

// 产品接口
public interface Product {
    // methods
}

然后便是一系列的产品ProductAProductB...实现Product接口。再写一个工厂实现类:

// 工厂实现类
public class FactoryA implements Factory {
    @Override
    public Product create(String productName) {
        // 这里有几种实现逻辑,下午详解
        return null; 
    }
}

// A产品实现类
public class ProductA implements Product {
}

// B产品实现类
public class ProductB implements Product {
}

我们看到,create方法可以有几种实现逻辑:

// 使用简单的字符串和if判断
public Product create(String productName) {
    if (productName == "A")
        return new ProductA();
    else if (productName == "B")
        return new ProductB();
    return null;
}

// 使用switch case
public Product create(String productName) {
    switch (productName) {
        case "A": return new ProductA();break;
        case "B": return new ProductB();break;
        default: return null;
    }
}

// 使用反射
public Product create(String productName){
    try {
        Class cls = Class.forName("productName");
        Product product = (Product) cls.newInstance();
        return product;
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    return null;
}

其中,最后一种通用性更强一点,如果加产品,也不用更改工厂类的代码。但实现较为复杂,且客户端需要传入类名,较为麻烦。

简单工厂模式

如果只有一个工厂类,那可以不必使用一个工厂接口和一个工厂实现类。可以直接用一个具有静态方法create的类。这种模式就是简单工厂模式。

多个工厂类

在产品类较多,且产品创建过程十分复杂且多样化时,不宜把所有代码放在一个方法里。可以使用多个工厂实现类FactoryAFactoryB...

代替单例模式

在工厂类的静态块中通过反射初始化单例产品对象,通过create方法返回该单例对象。

延迟初始化

当一个产品对象被消费完成后,工厂类并不立即释放该对象,而是保持其初始状态,等待再次被使用。可以使用一个Map来缓存。注意进行并发控制。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消