学习的第一种设计模式是23种设计模式中最简单也是用图比较广的一种,叫做工厂方法模式,工厂方法模式分为三种:普通工厂模式、多个工厂方法模式、静态工厂方法模式,下面我们一个个来学习吧。
案例
调用数据库的查询方法的例子,数据库有Oracle和MySQL两种。
一、普通工厂方法模式
建立一个工厂类,对实现同一接口的一些类进行实例的创建
1、UML

额,这个未注册的水印也是醉了。
2、创建DB接口
public interface DB {public String select();}
3、创建实现DB接口的Oracle和MySQL类
public class Oracle implements DB{@Overridepublic String select() {return "Oracle数据库查询";}}
public class MySQL implements DB{@Overridepublic 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数据库查询
总结
工厂方法模式分为三种:普通工厂模式、多个工厂方法模式、静态工厂方法模式。适合情况:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上三种模式中,第一种如果传入的字符串有误,则不能正确的创建对象,第三种相对于第二种不需要实例化工厂类,所以,大多数情况下,我们会选择第三种—静态工厂方法模式。
