工厂方法模式
作用: 定义一个用于创建对象的接口,让子类决定将哪一个类实例化,把一个类的实例化延迟到了子类。
优点: 满足开闭原则(对扩展开放,对修改关闭)。如下面的代码用例,当需要添加一个png的图片加类时,新增一个读取流程(实现 Reader 接口的类)、新增一个工厂实现类(实现 ReaderClassFactory 的类)。在整个过程中,不会对之前的类做任何修改操作,也就不会对已有的流程产生修改。
代码用例:
package designPattern.factory;
/**
* @Author Snail
* @Describe 工厂方法模式:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。
*
* 现在需要设计一个图片加载类,它具有多个图片加载器,用来加载jpg,gif格式的图片,每个加载器都有一个read()方法,用于读取图片
* @CreateTime 2019/12/24
*/
public class FactoryMethod {
public static void main(String[] args) {
//读取jpg
ReaderClassFactory factory=new JpgReaderFactory();
Reader reader = factory.getReader();
//读取gif
ReaderClassFactory factory1=new GifReaderFactory();
Reader reader1 = factory1.getReader();
System.out.println(reader.read());
System.out.println(reader1.read());
}
}
interface Reader{
String read();
}
class JpgReader implements Reader{
@Override
public String read() {
return "jpg reader method";
}
}
class GifReader implements Reader{
@Override
public String read() {
return "gif reader method";
}
}
interface ReaderClassFactory{
Reader getReader();
}
class JpgReaderFactory implements ReaderClassFactory{
@Override
public Reader getReader() {
return new JpgReader();
}
}
class GifReaderFactory implements ReaderClassFactory{
@Override
public Reader getReader() {
return new GifReader();
}
}
Spring 中的工厂方法模式获取 Bean
public interface FactoryBean <T> {
T getObject();
Class<?> getObjectType();
default boolean isSingleton(){return true;}
}
Spring中 FactoryBean 接口内的 getObject() 方法,就是工厂接口,每次在获取 Bean 时,就会执行该工厂接口其子类具体实现的方法。