聊聊工厂模式

聊聊工厂模式

介绍

工厂模式(Factory Pattern),顾名思义就是工厂。工厂是用来生产东西,那工厂模式也是如此。

一般情况下,工厂模式细分为三种:简单工厂、工厂方法和抽象工厂。

在没有工厂模式的情况下,我们实例化一个对象时,都是通过new来创建对象的。这些对象可能会被很多地方用到。一个个new实在太麻烦了。但我们可以用工厂模式来解决这些问题。

实例

首先,我们来了解一下简单工厂。

简单工厂(Simple Factory)

我在写关于设计模式的第一篇文章聊聊策略模式时,就有用到工厂模式,而那个工厂就是一个简单工厂。

根据不同的数据类型,来创建不同的类型,通常情况下,我们会使用if else或者switch来判断,需要创建什么样的对象:

public class DataHandlerFactory {
    public DataHandler createHandler(String type) {
        DataHandler handler = null;
        if ("snapshot".equals(type)) {
            handler = new SnapshotDataHandler();
        } else if ("table".equals(type)) {
            handler = new TableDataHandler();
        }
        return handler;
    }
}

工厂模式的命名一般都是Factory结尾,创建对象的方法一般都是create开头,但也不一定需要这么做,只要保证可读性就好了。

不过上面的代码有很多if else,想要去掉它,我们可以利用多态的方式,来优化代码解决这个问题。

工厂方法(Factory Method)

我们把上面的代码重构优化一下:

public interface IDataHandlerFactory {
    DataHandler create();
}

public class SnapshotDataHandlerFactory implements IDataHandlerFactory {
    @Override
    public DataHandler create() {
        return new SnapshotDataHandler();
    }
}

public class TableDataHandlerFactory implements IDataHandlerFactory {
    @Override
    public DataHandler create() {
        return new TableDataHandler();
    }
}

这就是工厂方法的典型代码。新增一个Handler时,我们是需要新增一个IDataHandlerFactory接口的Factory即可。

当然,这些都只是些简单的工厂实现。还有,随着数据类型的新多,工厂类也会变多,维护起来也很麻烦。

抽象工厂(Abstract Factory)

抽象工厂的话,一般来说没有前两种用的多。但也有场景可以用上它,特别是在工厂方法特别多的时候。

就比如,有十多的数据类型,但是有一部分的类型的数据,它们无需存储在数据库中,但要求存在缓存中。这样就可以分成两种不同职责的工厂。

这样,我们可以就定义两类接口,一类是负责生产存数据库的Handler,另外一类则是负责生产存缓存的Handler。

public interface IDataBaseDataHandlerFactory {
    TableDataHandler createTableDataHandler();
    // 新增的存数据库工厂可以继续在后面增加
}

public class DataBaseDataHandlerFactory implements IDataBaseDataHandlerFactory {
    @Override
    public TableDataHandler createTableDataHandler() {
        return new TableDataHandler();
    }
}


public interface ICacheDataHandlerFactory {
    SnapshotDataHandler createSnapshotDataHandler();
    IndexDataHandler createIndexDataHandler();
}

public class CacheDataHandlerFactory implements ICacheDataHandlerFactory {
    @Override
    public SnapshotDataHandler createSnapshotDataHandler() {
        return new SnapshotDataHandler();
    }

    @Override
    public IndexDataHandler createIndexDataHandler() {
        return new IndexDataHandler();
    }
}

这篇文章要介绍的工厂模式,大致就是这么多。这也是我在实际工作中用到比较多个一种设计模式。

第一种简单工厂(Simple Factory)在工作中使用的是比较多的一种,缺点是if else比较多。当然也有优化的方法就是把需要工厂生产的类,通过Key/Value的形式,存储在Map中,根据Key来找到Value。这样可以减少很多if else判断。

第二种工厂方法可以用多态来解决if else的问题,一旦工厂多了,维护起来就会很困难。于是,也就有了第三种方法。

第三种抽象工厂,根据分类或者职责来定义工厂,这样只需要根据特定的场景选择即可。

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×