目录
1、概述
优点:
缺点:
产品族:
2、代码实现
3、源码应用场景
抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,无需指定要创建的类,只需要指定一个抽象工厂类,由该工厂类实现所有相关对象的创建。
将一系列的产品族统一到一起创建。
规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口。
增加了系统的抽象性和理解难度。
所谓的产品族,指的是一些产品的集合,常常是为了一个目的或实现一个功能点,所需要的一些类,把这些类整合到一起,由一个类控制产生一堆类的对象。比如,对于Java知识来说,根据不同的表现记载形式,有Java视频、Java博客、Java图书、Java音频,等等,这些就可以组成一个产品族。
https://github.com/phs999/DesignPatterns/tree/900968a8a27e79e5b4df3bb167493f93917f292b/design_pattern/src/creational/abstractfactory
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(); } }
在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(); }