一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情。
抽象工厂模式
抽象工厂定义了一个产品族。
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
public abstract class AbstractFactory {
public abstract Color getColor(String color);
public abstract Shape getShape(String shape);
}
public class ShapeFactory extends AbstractFactory {
@Override
public Shape getShape(String shapeType){
if(shapeType == null){
return null;
}
if(shapeType.equalsIgnoreCase("CIRCLE")){
return new Circle();
} else if(shapeType.equalsIgnoreCase("RECTANGLE")){
return new Rectangle();
} else if(shapeType.equalsIgnoreCase("SQUARE")){
return new Square();
}
return null;
}
@Override
public Color getColor(String color) {
return null;
}
}
比如生产一辆汽车 需要发动机、轮胎等,发动机有不同的功率、型号,轮胎有不同的尺码、品牌。生产汽车可以创建一个抽象工厂,具体的部件是一个具体的工厂类。
在抽象工厂模式中,增加新的产品族很方便,但是增加新的产品等级结构很麻烦
工厂模式,简单工厂模式,抽象工厂模式三者区别
简单工厂通过静态方法创建对象。
工厂模式通过参数创建具体的对象。有工厂接口,产品由具体的工厂类创建。
抽象工厂创建一个产品族,每个产品由一个工厂创建。
常用的工厂类
日志工厂
private final static Logger logger = LoggerFactory.getLogger(HelloWord.class);
日历
Calendar calendar = Calendar.getInstance();
Spring中的Factory
BeanFactory: 工厂类,在调用getBean()方法时,才会生成类的实例。 ApplicationContext: 在加载配置文件的时候,就会将 Spring 管理的类都实例化。有两个实现类: ClassPathXmlApplicationContext: 加载类路径下的配置文件 FileSystemXmlApplicationContext: 加载磁盘下的配置文件
AbstractBeanFactory抽象类
@Override
public Object getBean(String name) throws BeansException {
return doGetBean(name, null, null, false);
}
@Override
public <T> T getBean(String name, Class<T> requiredType) throws BeansException {
return doGetBean(name, requiredType, null, false);
}
@Override
public Object getBean(String name, Object... args) throws BeansException {
return doGetBean(name, null, args, false);
}
doGetBean
是AbstractBeanFactory的核心类,通过BeanFactory创建对象,由不同的实现类创建bean实例对象。如AbstractAutowireCapableBeanFactory
, 通过class类创建对象。
protected abstract Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
throws BeanCreationException;