抽象工厂模式
抽象工厂模式定义
抽象工厂模式(Abstract Factory Pattern),属于对象创建型模式。提供一个创建一系列相关或相互依赖(即一族)对象的接口,不需要指定它们具体的类。
产品族小解

上图中Phone和Computer属于不同的产品等级结构,即产品的继承结构。如一个抽象的手机,子类可以是苹果手机、联想手机、小米手机,这样抽象的手机和具体品牌的手机之间构成了一个产品等级结构,抽象手机作为父类,品牌手机作为子类。电脑的产品等级结构也是如此。
而上图中指出的产品族,简单理解就是产品的家族。即由一个工厂生产的位于不同产品等级结构中的一组产品。上图中iPhone是手机产品等级结构、MacBook是电脑产品等级结构,但都是苹果公司一族的。
抽象工厂模式适用环境
1.当系统提供的工厂需生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构中属于不同类型的具体产品时。简而言之,抽象工厂模式需要面对的是多个产品等级结构,而工厂方法模式针对的是一个产品等级结构。
UML类图解释
ProductA_Phone:产品A接口
ProductB_Computer :产品B接口
ConcreteProductA1_Iphone: 具体A类产品A1(实现产品A接口)
ConcreteProductA2_Lenove: 具体A类产品A2(实现产品A接口)
ConcreteProductA3_Xiaomi: 具体A类产品A3(实现产品A接口)
ConcreteProductB1_MacBook: 具体B类产品B1(实现产品B接口)
ConcreteProductB2_ThinkPad: 具体B类产品B2(实现产品B接口)
ConcreteProductB3_XiaomiAir :具体B类产品B3(实现产品B接口)
Factory :工厂接口
Factory1_Apple :具体Apple族工厂
Factory2_Lenove: 具体Lenove族工厂
Factory3_Xiaomi :具体Xiaomi族工厂
样例代码
package com.sedion.mynawang.Chapter02_AbstractFactoryPattern;
import java.util.logging.Logger;
/**
* 产品A 手机类 苹果家族 ==> 苹果手机
* @auther mynawang
* @create 2016-12-29 10:41
*/
public class ConcreteProductA1_Iphone implements ProductA_Phone{
private Logger logger = Logger.getLogger("ConcreteProductA1_Iphone_Log");
public ConcreteProductA1_Iphone() {
logger.info("抽象工厂 ==> 苹果手机被创建ConcreteProductA1_Iphone");
}
}
package com.sedion.mynawang.Chapter02_AbstractFactoryPattern;
import java.util.logging.Logger;
/**
* 产品A 手机类 联想家族 ==> 联想手机
* @auther mynawang
* @create 2016-12-29 10:41
*/
public class ConcreteProductA2_Lenove implements ProductA_Phone{
private Logger logger = Logger.getLogger("ConcreteProductA2_Lenove_Log");
public ConcreteProductA2_Lenove() {
logger.info("抽象工厂 ==> 联想手机被创建ConcreteProductA2_Lenove");
}
}
package com.sedion.mynawang.Chapter02_AbstractFactoryPattern;
import java.util.logging.Logger;
/**
* 产品A 手机类 小米家族 ==> 小米手机
* @auther mynawang
* @create 2016-12-29 10:41
*/
public class ConcreteProductA3_Xiaomi implements ProductA_Phone{
private Logger logger = Logger.getLogger("ConcreteProductA3_Xiaomi_Log");
public ConcreteProductA3_Xiaomi() {
logger.info("抽象工厂 ==> 小米手机被创建ConcreteProductA3_Xiaomi");
}
}
package com.sedion.mynawang.Chapter02_AbstractFactoryPattern;
import java.util.logging.Logger;
/**
* 产品B 电脑类 苹果家族 ==> 苹果电脑
* @auther mynawang
* @create 2016-12-29 10:42
*/
public class ConcreteProductB1_MacBook implements ProductB_Computer {
private Logger logger = Logger.getLogger("ConcreteProductB1_MacBook_Log");
public ConcreteProductB1_MacBook() {
logger.info("抽象工厂 ==> 苹果电脑被创建ConcreteProductB1_MacBook");
}
}
package com.sedion.mynawang.Chapter02_AbstractFactoryPattern;
import java.util.logging.Logger;
/**
* 产品B 电脑类 联想家族 ==> 联想电脑
* @auther mynawang
* @create 2016-12-29 10:42
*/
public class ConcreteProductB2_ThinkPad implements ProductB_Computer {
private Logger logger = Logger.getLogger("ConcreteProductB2_ThinkPad_Log");
public ConcreteProductB2_ThinkPad() {
logger.info("抽象工厂 ==> 联想电脑ThinkPad被创建ConcreteProductB2_ThinkPad");
}
}
package com.sedion.mynawang.Chapter02_AbstractFactoryPattern;
import java.util.logging.Logger;
/**
* 产品B 电脑类 小米家族 ==> 小米电脑
* @auther mynawang
* @create 2016-12-29 10:42
*/
public class ConcreteProductB3_XiaomiAir implements ProductB_Computer {
private Logger logger = Logger.getLogger("ConcreteProductB3_XiaomiAir_Log");
public ConcreteProductB3_XiaomiAir() {
logger.info("抽象工厂 ==> 小米笔记本Air被创建ConcreteProductB3_XiaomiAir");
}
}
package com.sedion.mynawang.Chapter02_AbstractFactoryPattern;
/**
* 抽象工厂(一组用于创建一族产品的方法,一个方法对应一类产品)
* @auther mynawang
* @create 2016-12-29 10:43
*/
public interface Factory {
ProductA_Phone createProductA();
ProductB_Computer createProductB();
}
package com.sedion.mynawang.Chapter02_AbstractFactoryPattern;
/**
* 具体工厂(苹果公司工厂,用于生产苹果家族的产品)
* @auther mynawang
* @create 2016-12-29 10:43
*/
public class Factory1_Apple implements Factory{
@Override
public ProductA_Phone createProductA() {
return new ConcreteProductA1_Iphone();
}
@Override
public ProductB_Computer createProductB() {
return new ConcreteProductB1_MacBook();
}
}
package com.sedion.mynawang.Chapter02_AbstractFactoryPattern;
/**
* 具体工厂(联想公司工厂,用于生产联想家族的产品)
* @auther mynawang
* @create 2016-12-29 10:44
*/
public class Factory2_Lenove implements Factory {
@Override
public ProductA_Phone createProductA() {
return new ConcreteProductA2_Lenove();
}
@Override
public ProductB_Computer createProductB() {
return new ConcreteProductB2_ThinkPad();
}
}
package com.sedion.mynawang.Chapter02_AbstractFactoryPattern;
/**
* 具体工厂(小米公司工厂,用于生产小米家族的产品)
* @auther mynawang
* @create 2016-12-29 10:44
*/
public class Factory3_Xiaomi implements Factory {
@Override
public ProductA_Phone createProductA() {
return new ConcreteProductA3_Xiaomi();
}
@Override
public ProductB_Computer createProductB() {
return new ConcreteProductB3_XiaomiAir();
}
}
package com.sedion.mynawang.Chapter02_AbstractFactoryPattern;
/**
* 产品A(一类产品 手机)接口
* @auther mynawang
* @create 2016-12-29 10:39
*/
public interface ProductA_Phone {
}
package com.sedion.mynawang.Chapter02_AbstractFactoryPattern;
/**
* 产品B(一类产品 电脑)接口
* @auther mynawang
* @create 2016-12-29 10:39
*/
public interface ProductB_Computer {
}
package com.sedion.mynawang;
import com.sedion.mynawang.Chapter02_AbstractFactoryPattern.*;
/**
* 抽象工厂模式测试
* @auther mynawang
* @create 2016-12-29 11:02
*/
public class Chapter02_AbstractFactoryPattern_test {
public static void main(String[] args) {
Factory factory1 = new Factory1_Apple();
factory1.createProductA();
factory1.createProductB();
Factory factory2 = new Factory2_Lenove();
factory2.createProductA();
factory2.createProductB();
Factory factory3 = new Factory3_Xiaomi();
factory3.createProductA();
factory3.createProductB();
}
}
// 打印结果 Connected to the target VM, address: '127.0.0.1:54302', transport: 'socket' 十二月 29, 2016 8:36:24 下午 com.sedion.mynawang.Chapter02_AbstractFactoryPattern.ConcreteProductA1_Iphone <init> 信息: 抽象工厂 ==> 苹果手机被创建ConcreteProductA1_Iphone 十二月 29, 2016 8:36:24 下午 com.sedion.mynawang.Chapter02_AbstractFactoryPattern.ConcreteProductB1_MacBook <init> 信息: 抽象工厂 ==> 苹果电脑被创建ConcreteProductB1_MacBook 十二月 29, 2016 8:36:24 下午 com.sedion.mynawang.Chapter02_AbstractFactoryPattern.ConcreteProductA2_Lenove <init> 信息: 抽象工厂 ==> 联想手机被创建ConcreteProductA2_Lenove 十二月 29, 2016 8:36:24 下午 com.sedion.mynawang.Chapter02_AbstractFactoryPattern.ConcreteProductB2_ThinkPad <init> Disconnected from the target VM, address: '127.0.0.1:54302', transport: 'socket' 信息: 抽象工厂 ==> 联想电脑ThinkPad被创建ConcreteProductB2_ThinkPad 十二月 29, 2016 8:36:24 下午 com.sedion.mynawang.Chapter02_AbstractFactoryPattern.ConcreteProductA3_Xiaomi <init> 信息: 抽象工厂 ==> 小米手机被创建ConcreteProductA3_Xiaomi 十二月 29, 2016 8:36:24 下午 com.sedion.mynawang.Chapter02_AbstractFactoryPattern.ConcreteProductB3_XiaomiAir <init> 信息: 抽象工厂 ==> 小米笔记本Air被创建ConcreteProductB3_XiaomiAir Process finished with exit code 0
抽象工厂模式优点
1.增加新的具体工厂和产品族很方便,无需修改功能,只要新加相应的产品族即可,符合“开闭原则”。
2.所有具体工厂都实现了抽象工厂中定义的公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。
抽象工厂模式缺点
当增加新的产品等级结构(产品种类)时很麻烦,需要调整抽象类以及所有的具体实现类,会带来很大的不便。具有开闭原则的倾斜性。
抽象工厂模式应用
java.util.Calendar#getInstance() java.util.Arrays#asList() java.sql.DriverManager#getConnection() java.sql.Connection#createStatement() java.sql.Statement#executeQuery()

本人20有余,天资愚钝,深信勤能补拙。酷爱编程,爱钻研,广交码友,耕于三线,日以继夜而使飞燕之身蜕变为大腹便便。
有志之士点击链接加入技术交流群【专注的程序猿】282087535
文章如果对你有所帮助是我的荣幸,不妥之处希望指正,转帖请注明本文出自钰火的小栈(http://www.mynawang.com/),请尊重他人的辛勤劳动成果,谢谢!


浙公网安备 33010602011771号