抽象工厂模式

69 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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;