抽象工厂模式
相较于普通工厂模式,抽象工厂模式的规模更大,是围绕一个超级工厂创建其他的工厂,可以理解为生产工厂的工厂。
原理理解
自己的衣柜里挂着各种不同的衣服,我们可以将衣柜理解为工厂,从里面可以获得不同的衣服,我们只需要提供想要获取的衣服信息;当然,家里面可能不止一个衣柜,有的衣柜是装衣服的,有的是装被子的,这时家可以看成是衣柜的工厂,通过家我们可以获取到衣柜。家获取到衣柜,衣柜获取到衣服,我们将家抽象出来,变为一个抽象的工厂类,我们只需要告诉家我们想开哪个衣柜,我们就能获取到那个衣柜。
代码实现
代码实现这里我们用两个关联不太大的工厂来演示:
/**
* 我们使用手机工厂和色彩工厂来演示,虽然他们没有什么关联,但是他们都是工厂
* 手机工厂生产三种不同的手机
* 色彩工厂生产三种不同的色彩
*/
//产品种类接口,手机的接口,我们可以直接通过手机来访问不同品牌的手机
interface Phone{
String type();
}
class HuaWei implements Phone{
@Override
public String type() {
return "HuaWei MateX";
}
}
class IPhone implements Phone{
@Override
public String type() {
return "IPhone 12MAX";
}
}
class OnePlus implements Phone{
@Override
public String type() {
return "OnePlus 9";
}
}
//色彩接口
interface Color{
String color();
}
class White implements Color{
@Override
public String color() {
return "white";
}
}
class Green implements Color{
@Override
public String color() {
return "green";
}
}
class Blue implements Color{
@Override
public String color() {
return "blue";
}
}
//创建手机工厂和颜色工厂的抽象工厂
public abstract class AbstractFactory {
public abstract Phone getPhone(String phone);
public abstract Color getColor(String color);
}
//继承抽象工厂,创建工厂类
//手机工厂
class PhoneFactory extends AbstractFactory{
@Override
public Phone getPhone(String phone) {
if ("HuaWei".equals(phone)){
return new HuaWei();
}else if ("IPhone".equals(phone)){
return new IPhone();
}else if ("OnePlus".equals(phone)){
return new OnePlus();
}else {
return null;
}
}
@Override
public Color getColor(String color) {
return null;
}
}
//颜色工厂
class ColorFactory extends AbstractFactory {
@Override
public Phone getPhone(String phone) {
return null;
}
@Override
public Color getColor(String color) {
if(color == null){
return null;
}
if("white".equals(color)){
return new White();
} else if("green".equals(color)){
return new Green();
} else if("blue".equals(color)){
return new Blue();
}
return null;
}
}
//创建工厂创造器
class FactoryProducer{
public static AbstractFactory getFactory(String factory){
if ("phone".equals(factory)){
return new PhoneFactory();
}else if("color".equals(factory)){
return new ColorFactory();
}else {
return null;
}
}
}
//测试类
class AbstractFactoryDemo{
public static void main(String[] args) {
//获取一个手机工厂
AbstractFactory phoneFactory=FactoryProducer.getFactory("phone");
//获取一个手机
Phone phone=phoneFactory.getPhone("IPhone");
//查看手机类型
System.out.println(phone.type());
//获取一个色彩工厂
AbstractFactory colorFactory=FactoryProducer.getFactory("color");
//获取一个色彩
Color color=colorFactory.getColor("blue");
//查看色彩
System.out.println(color.color());
}
}