学习的第一种设计模式是23种设计模式中最简单也是用图比较广的一种,叫做工厂方法模式,工厂方法模式分为三种:普通工厂模式、多个工厂方法模式、静态工厂方法模式,下面我们一个个来学习吧。
案例
调用数据库的查询方法的例子,数据库有Oracle和MySQL两种。
一、普通工厂方法模式
建立一个工厂类,对实现同一接口的一些类进行实例的创建
1、UML
额,这个未注册的水印也是醉了。
2、创建DB接口
public interface DB {
public String select();
}
3、创建实现DB接口的Oracle和MySQL类
public class Oracle implements DB{
@Override
public String select() {
return "Oracle数据库查询";
}
}
public class MySQL implements DB{
@Override
public String select() {
return "MySQL数据库查询";
}
}
3、创建普通工厂类(SimpleFactory)
/**
* 普通工厂方法模式
* 普通工厂方法模式,根据传过来的类型生成相应的对象
* @author suibibk.com
*/
public class SimpleFactory {
public DB product(String DBName) {
if("Oracle".equals(DBName)) {
return new Oracle();
}else if("MySQL".equals(DBName)) {
return new MySQL();
}else {
System.out.println("请输入正确的类型");
return null;
}
}
public static void main(String[] args) {
SimpleFactory simpleFactory = new SimpleFactory();
DB db1 = simpleFactory.product("Oracle");
DB db2 = simpleFactory.product("MySQL");
System.out.println(db1.select());
System.out.println(db2.select());
}
}
4、启动测试
运行上面的main方法,结果如下
Oracle数据库查询
MySQL数据库查询
二、多个工厂方法模式
是对普通工厂方法模式的改进,在普通方法模式中,如果传递的字符串出错,则不能正确的创建对象,而多个工厂方法模式是提供了多个工厂方法,分别创建对象。
1、UML
2、创建多个工厂类(ManyFactory)
/**
* 多个工厂方法模式
* 为每一种产品都提供一个创建方法
* @author suibibk.com
*
*/
public class ManyFactory {
public DB productOracle() {
return new Oracle();
}
public DB productMySQL() {
return new MySQL();
}
public static void main(String[] args) {
ManyFactory manyFactory = new ManyFactory();
DB db1 = manyFactory.productOracle();
DB db2 = manyFactory.productMySQL();
System.out.println(db1.select());
System.out.println(db2.select());
}
}
接口和产品不变
3、启动测试
运行上面的main方法,结果如下
Oracle数据库查询
MySQL数据库查询
三、静态工厂方法模式
将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。
1、UML
跟多个工厂方法类一样,只不过工厂里的方法是静态方法罢了。这里就不画了。
2、创建静态工厂类(StaticFactory)
/**
* 静态工厂方法模式
* 将多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。
* @author suibibk.com
*
*/
public class StaticFactory {
public static DB productOracle() {
return new Oracle();
}
public static DB productMySQL() {
return new MySQL();
}
public static void main(String[] args) {
DB db1 = StaticFactory.productOracle();
DB db2 = StaticFactory.productMySQL();
System.out.println(db1.select());
System.out.println(db2.select());
}
}
接口和产品不变
3、启动测试
运行上面的main方法,结果如下
Oracle数据库查询
MySQL数据库查询
总结
工厂方法模式分为三种:普通工厂模式、多个工厂方法模式、静态工厂方法模式。适合情况:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上三种模式中,第一种如果传入的字符串有误,则不能正确的创建对象,第三种相对于第二种不需要实例化工厂类,所以,大多数情况下,我们会选择第三种—静态工厂方法模式。