原创文章,转载请务必将下面这段话置于文章开头处(保留超链接)。
本文转发自技术世界,原文链接 http://www.jasongj.com/design_pattern/factory_method/
工厂方法模式解决的问题
上文《简单工厂模式不简单》中提到,简单工厂模式有如下缺点,而工厂方法模式可以解决这些问题
工厂方法模式
工厂方法模式介绍
工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫多态工厂模式或者虚拟构造器模式。在工厂方法模式中,工厂父类定义创建产品对象的公共接口,具体的工厂子类负责创建具体的产品对象。每一个工厂子类负责创建一种具体产品。
工厂方法模式类图
工厂模式类图如下 (点击可查看大图)
工厂方法模式角色划分
抽象产品(或者产品接口),如上图中IUserDao
具体产品,如上图中的MySQLUserDao,PostgreSQLUserDao和OracleUserDao
抽象工厂(或者工厂接口),如IFactory
具体工厂,如MySQLFactory,PostgreSQLFactory和OracleFactory
工厂方法模式使用方式
如简单工厂模式直接使用静态工厂方法创建产品对象不同,在工厂方法,客户端通过实例化具体的工厂类,并调用其创建实例接口创建具体产品类的实例。根据依赖倒置原则,具体工厂类的实例由工厂接口引用(客户端依赖于抽象工厂而非具体工厂),具体产品的实例由产品接口引用(客户端和工厂依赖于抽象产品而非具体产品)。具体调用代码如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16package com.jasongj.client;
import com.jasongj.dao.IUserDao;
import com.jasongj.factory.IDaoFactory;
import com.jasongj.factory.MySQLDaoFactory;
public class Client {
public static void main(String[] args) {
IDaoFactory factory = new MySQLDaoFactory();
IUserDao userDao = factory.createUserDao();
userDao.getUser("admin");
}
}
工厂方法模式示例代码
本文所述工厂方法模式示例代码可从作者Github下载