目录
1、概述
抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,无需指定要创建的类,只需要指定一个抽象工厂类,由该工厂类实现所有相关对象的创建。
优点:
将一系列的产品族统一到一起创建。
缺点:
规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口。
增加了系统的抽象性和理解难度。
产品族:
所谓的产品族,指的是一些产品的集合,常常是为了一个目的或实现一个功能点,所需要的一些类,把这些类整合到一起,由一个类控制产生一堆类的对象。比如,对于Java知识来说,根据不同的表现记载形式,有Java视频、Java博客、Java图书、Java音频,等等,这些就可以组成一个产品族。
2、代码实现
package creational.abstractfactory;
public interface CourseFactory {
Video getVideo();
Aticle getArticle();
}
我们看到抽象工厂核心的Interface CourseFactory中的返回值Video和Article也都是抽象类或接口。
package creational.abstractfactory;
public class JavaCourceFactory implements CourseFactory{
@Override
public Video getVideo() {
return new JavaVideo();
}
@Override
public Aticle getArticle() {
return new JavaArticle();
}
}
package creational.abstractfactory;
public class JavaVideo extends Video {
@Override
public void produce() {
System.out.println("录制Java课程视频");
}
}
package creational.abstractfactory;
public class JavaArticle extends Article {
@Override
public void produce() {
System.out.println("编写Java课程文章");
}
}
package creational.abstractfactory;
public class Test {
public static void main(String[] args) {
CourseFactory courseFactory = new JavaCourceFactory();
Video video = courseFactory.getVideo();
video.produce();
}
}
3、源码应用场景
在MyBatis中,SqlSessionFactory工厂,实现了SqlSession和Configuration两种对象的创建,这两种具体实现对象属于一个产品族。
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package org.apache.ibatis.session;
import java.sql.Connection;
public interface SqlSessionFactory {
SqlSession openSession();
SqlSession openSession(boolean var1);
SqlSession openSession(Connection var1);
SqlSession openSession(TransactionIsolationLevel var1);
SqlSession openSession(ExecutorType var1);
SqlSession openSession(ExecutorType var1, boolean var2);
SqlSession openSession(ExecutorType var1, TransactionIsolationLevel var2);
SqlSession openSession(ExecutorType var1, Connection var2);
Configuration getConfiguration();
}