抽象工厂模式是工厂方法模式的升级版本,工厂方法模式的工厂是创建出一种产品,而抽象工厂是创建出一类产品。
比如我们前面普通工厂模式中学习的画图,正方形产品对应正方形的工厂,圆形对应圆形的工厂,每个产品对应一个工厂。比如我们现在要画多个颜色的图形,那么不同颜色的圆形就是一个系列,抽象工厂模式就可以实现一个工厂对应一个图形颜色系列。
白色系列有圆形、正方形两个产品,红色系列也有圆形、正方形两个产品。现在用抽象工厂模式来创建一下这两个系列的产品。
一、首先建立圆形产品:
package com.xing.design.factory.shape.ab.shape;
/**
* 圆形产品
* @author xing
*/
public abstract class Circle{
public abstract void draw();
}
// 圆形的红色系列
package com.xing.design.factory.shape.ab.shape;
/**
* 圆形红色系列
* @author xing
*/
public class RedCircle extends Circle{
@Override
public void draw() {
System.out.println("画一个红色圆形。。。");
}
}
// 圆形的白色系列
package com.xing.design.factory.shape.ab.shape;
/**
* 圆形产品
* @author xing
*/
public class WhiteCircle extends Circle{
@Override
public void draw() {
System.out.println("画一个白色圆形。。。");
}
}
二、再建立正方形产品
package com.xing.design.factory.shape.ab.shape;
/**
* 正方形产品
* @author xing
*/
public abstract class Square{
public abstract void draw();
}
// 正方形的红色系列
package com.xing.design.factory.shape.ab.shape;
/**
* 红色正方形
* @author xing
*/
public class RedSquare extends Square{
@Override
public void draw() {
System.out.println("画一个红色正方形。。。");
}
}
// 正方形的白色系列
package com.xing.design.factory.shape.ab.shape;
/**
* 白色正方形
* @author xing
*/
public class WhiteSquare extends Square{
@Override
public void draw() {
System.out.println("画一个白色正方形。。。");
}
}
三、建立抽象工厂
package com.xing.design.factory.shape.ab.factory;
import com.xing.design.factory.shape.ab.shape.Circle;
import com.xing.design.factory.shape.ab.shape.Square;
/**
* 抽象工厂模式
* @author xing
*/
public interface AbstractFactory {
// 获取圆形实例对象
Circle getCircle();
// 获取正方形实例对象
Square getSquare();
}
1.红色系列的工厂,用来获取红色系列产品
package com.xing.design.factory.shape.ab.factory;
import com.xing.design.factory.shape.ab.shape.Circle;
import com.xing.design.factory.shape.ab.shape.RedCircle;
import com.xing.design.factory.shape.ab.shape.RedSquare;
import com.xing.design.factory.shape.ab.shape.Square;
public class RedFactory implements AbstractFactory {
@Override
public Circle getCircle() {
return new RedCircle();
}
@Override
public Square getSquare() {
return new RedSquare();
}
}
2.白色系列的工厂,用来获取白色系列产品
package com.xing.design.factory.shape.ab.factory;
import com.xing.design.factory.shape.ab.shape.Circle;
import com.xing.design.factory.shape.ab.shape.Square;
import com.xing.design.factory.shape.ab.shape.WhiteCircle;
import com.xing.design.factory.shape.ab.shape.WhiteSquare;
public class WhiteFactory implements AbstractFactory {
@Override
public Circle getCircle() {
return new WhiteCircle();
}
@Override
public Square getSquare() {
return new WhiteSquare();
}
}
四、测试:
package com.xing.design.factory.shape.ab;
import com.xing.design.factory.shape.ab.factory.RedFactory;
import com.xing.design.factory.shape.ab.factory.WhiteFactory;
public class ABDemo {
public static void main(String[] args) {
RedFactory redFactory = new RedFactory();
redFactory.getCircle().draw();
redFactory.getSquare().draw();
WhiteFactory whiteFactory = new WhiteFactory();
whiteFactory.getCircle().draw();
whiteFactory.getSquare().draw();
}
}
核心代码是抽象工厂及其工厂实现类,每一个产品的每一个系列,都要在其中添加并实现。
总结:
抽象工厂模式就是在抽象工厂中添加每一个产品,然后按照不同系列添加工厂实现类,并在实现类中能获取到每一个产品,通过这个系列的工厂实现类,创建出每一个系列下的产品。
END