工厂模式是一种创建型设计模式。
开闭原则
开闭原则是设计模式原则之一,倡导实体应当对扩展开发,对修改关闭。
意思是说,你想要扩展或者修改已写好代码的功能,可以往里面加入新的代码,但不允许修改修改以前已经写好的代码。
高耦合将会导致,拓展功能时,不得不修改以前的代码。
比如
public class Service {
Dao dao = new JpaDao();
void service(){
//使用dao进行一系列持久层操作
}
}
起初我们使用JPA作为ORM,将数据库操作都封装在JpaDao里面,通过new来创建JpaDao实例。如果要把JPA改成Mybatis,就需要逐个去修改用到JpaDao的Service类。这就是Service和Dao的紧耦合导致违反开闭原则。
为什么会紧耦合?是因为Service中直接new了一个非常具体的对象。
new操作本身就是一个耦合操作
引入工厂类
想要解耦,就得去掉new,但是要创建对象就必须得new。所以我们将new换个地方,创建一个工厂类。
public class DaoFactory {
public static Dao getDao() {
return new JpaDao();
}
}
public class Service {
Dao dao = DaoFactory.getDao();
void service(){
//使用dao进行一系列持久层操作
}
}
这样的好处就是,后续不管更换什么持久层框架,只需要改工厂类里的代码一个地方就好。
但是根本问题还是没解决,还是违反了开闭原则。因为到时候还是得改DaoFactory的代码。
如何才能不改代码修改实现方法?可以将类名写在配置文件,通过反射创建对象。这样就把耦合从代码提到了配置文件。
dao=com.example.demo.pattern.factory.JpaDao
public class DaoFactory {
public static Dao getDao() {
Properties properties = new Properties();
properties.load(DaoFactory.class.getClassLoader().getResourceAsStream(“config.properties”));
Class<?> dao = Class.forName((String) properties.get("dao"));
return (Dao) dao.newInstance();
}
}
简单工厂模式
简单工厂模式,又叫静态工厂模式。顾名思义,就是通过静态方法获取实例。
public class Factory {
public static <R,P> R getInstance(P type){
//根据传入的type不同做if else判断返回不同类型的对象。
}
}
pu