继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

设计模式之工厂方法模式

慕设计6931647
关注TA
已关注
手记 54
粉丝 7190
获赞 186
为什么使用工厂模式?

简单的对象可以直接通过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来缓存。注意进行并发控制。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP