工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重问题,由于工厂模式中的每个工厂只能生产一类产品,可能会导致大量的工厂类,,势必会增加系统的开销,此时可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来生产。———这也就是抽象工厂的基本思想。
在讲抽象工厂模式之前,我们必须明白两个概念: 产品等级结构 、 产品族。
我们看到不同的颜色的多个椭圆形、正方形、三角形分别构成了三个不同的产品等级结构,而颜色相同的椭圆、正方形、三角形构成一个产品族,可以看到每一个形状都位于某个产品族,并不属于某个产品等级结构,图中有4个产品族,分属于3个不同的产品等级结构。只要知道一个产品的所处的产品族和产品等级结构,就可以确定这个产品。
定义:提供一个创建一系列相关或相互依赖的接口,而无需指定它们具体的类。抽象工厂模式又称为Kit模式,它也是一种对象创建型模式
在抽象工厂模式有一下几个角色:
代码实现:
AbstractProduct(抽象产品)
/**
* @program
* @Desc 抽象 产品A
* @Author 游戏人日常
* @CreateTime 2019/07/15--18:56
*/
public abstract class AbstractProductA {
}
/**
* @program
* @Desc 抽象 产品B
* @Author 游戏人日常
* @CreateTime 2019/07/15--18:57
*/
public abstract class AbstractProductB {
}
ConcreteProduct(具体产品) : 产品A和产品B构成产品族, A1和A2构成产品等级结构。
/**
* @program
* @Desc 具体的产品 A1
* @Author 游戏人日常
* @CreateTime 2019/07/15--19:04
*/
public class ConcreteProductA1 extends AbstractProductA{
}
/**
* @program
* @Desc 具体的产品 B1
* @Author 游戏人日常
* @CreateTime 2019/07/15--19:04
*/
public class ConcreteProductB1 extends AbstractProductB{
}
/**
* @program
* @Desc 具体的产品 A2
* @Author 游戏人日常
* @CreateTime 2019/07/15--19:03
*/
public class ConcreteProductA2 extends AbstractProductA{
}
/**
* @program
* @Desc 具体的产品 B2
* @Author 游戏人日常
* @CreateTime 2019/07/15--19:07
*/
public class ConcreteProductB2 extends AbstractProductB {
}
AbstractFactory(抽象工厂)
/**
* @program
* @Desc 抽象工厂
* @Author 游戏人日常
* @CreateTime 2019/07/15--19:16
*/
public abstract class AbstractFactory {
public abstract AbstractProductA createProductA();
public abstract AbstractProductB createProductB();
}
ConcreteFactory(具体工厂)
/**
* @program
* @Desc 具体工厂 1
* @Author 游戏人日常
* @CreateTime 2019/07/15--19:20
*/
public class ConcreteFactory1 extends AbstractFactory {
@Override
public AbstractProductA createProductA() {
return new ConcreteProductA1();
}
@Override
public AbstractProductB createProductB() {
return new ConcreteProductB1();
}
}
/**
* @program
* @Desc 具体工厂 2
* @Author 游戏人日常
* @CreateTime 2019/07/15--19:21
*/
public class ConcreteFactory2 extends AbstractFactory {
@Override
public AbstractProductA createProductA() {
return new ConcreteProductA2();
}
@Override
public AbstractProductB createProductB() {
return new ConcreteProductB2();
}
}
客户端测试:
/**
* @program
* @Desc
* @Author 游戏人日常
* @CreateTime 2019/07/15--19:25
*/
public class Test {
public static void main(String args[]){
//声明一个工厂1 就可以生产 A1和B1
AbstractFactory factory1= new ConcreteFactory1();
AbstractProductA productA1=factory1.createProductA();
AbstractProductB productB1=factory1.createProductB();
//声明一个工厂2 就可以生产 A2和B2
AbstractFactory factory2= new ConcreteFactory2();
AbstractProductA productA2=factory2.createProductA();
AbstractProductB productB2=factory2.createProductB();
}
}
在抽象工厂模式中,增加新的产品族很方便,但是增加新的产品等级结构就很麻烦,抽象工厂模式的这种性质称为**“开闭原则“的倾斜性**
”增加产品族“ 代码如下:
新增的产品族:
/**
* @program
* @Desc
* @Author 游戏人日常
* @CreateTime 2019/07/15--20:33
*/
public class ConcreteProductA3 extends AbstractProductA {
}
/**
* @program
* @Desc
* @Author 游戏人日常
* @CreateTime 2019/07/15--20:33
*/
public class ConcreteProductB3 extends AbstractProductB {
}
新增具体的工厂类
/**
* @program
* @Desc
* @Author 游戏人日常
* @CreateTime 2019/07/15--20:34
*/
public class ConcreteFactory3 extends AbstractFactory {
@Override
public AbstractProductA createProductA() {
return new ConcreteProductA3();
}
@Override
public AbstractProductB createProductB() {
return new ConcreteProductB3();
}
}
客户端测试:
/**
* @program
* @Desc
* @Author 游戏人日常
* @CreateTime 2019/07/15--19:25
*/
public class Test {
public static void main(String args[]){
//声明一个工厂1 就可以生产 A1和B1
AbstractFactory factory1= new ConcreteFactory1();
AbstractProductA productA1=factory1.createProductA();
AbstractProductB productB1=factory1.createProductB();
//声明一个工厂1 就可以生产 A2和B2
AbstractFactory factory2= new ConcreteFactory2();
AbstractProductA productA2=factory2.createProductA();
AbstractProductB productB2=factory2.createProductB();
//(新增) 声明一个工厂3 就可以生产 A3和B3
AbstractFactory factory3= new ConcreteFactory3();
AbstractProductA productA3=factory2.createProductA();
AbstractProductB productB3=factory2.createProductB();
}
}
抽象工厂模式是工厂方法模式的进一步延申,继承了工厂方法模式的优点,也弥补了工厂方法模式的一些缺点。 工厂方法模式针对的是一个产品等级结构,而抽象工厂模式是面对多个产品等级结构。
抽象工厂模式增加产品族方便,无需修改代码,只需增加具体的产品类和具体工厂类,符合”开闭原则“。 增加产品等级结构就需要改工厂类(抽象和具体的工厂都改)
抽象模式优缺点