工厂方法(FactoryMethod)模式定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中,满足创建型模式中所要求的‘创建与使用相分离’的特点。如果创建的产品(对象)不多,只有一个工厂类就可以的话,这种模式称为‘简单工厂模式’,但它不属于23中设计模式,因为增加产品是会违背‘开闭原则’。
优点:用户只需要知道具体的工厂名称就可以得到所需要的产品,不需要产品创建的详细过程。
新增产品是只需要添加具体的产品类和具体的工厂类。不需要对原工厂进行改变,满足‘开闭原则’。但是会有一个缺点,没当新增一个产品,就需要增加一个具体的产品类和对应的工厂类,增加了系统的复杂度。
使用场景: 1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。 3、设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。
注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
代码演示:
interface food{}
class Apple implements food{}
class Banana implements food{}
class Watermelon implements food{}
public class StaticFactory {
private StaticFactory(){}
public static food getApple(){
return new Apple();
}
public static food getBanana(){
return new Banana();
}
public static food getWatermelon(){
return new Watermelon();
}
}
class Client{
//用户只需要知道具体的工厂名称就可以得到所需要的产品,不需要产品创建的详细过程
public void get(String name){
food f = null ;
if ( name.equals("Apple")) {
f = StaticFactory.getApple();
}else if ( name.equals("Banana")){
f = StaticFactory.getBanana();
}else {
f = StaticFactory.getWatermelon();
}
}
}