抽象工厂是用来创建其他工厂的类,抽象模式和工厂模式相同,只是工厂类创建具体的产品类,但是抽象工厂模式使用一个超级工厂来创建其他工厂;即工厂的工厂;
这里具体的应用我现在还没有彻底理解,之后在工作实践中有更深的体会之后再来补充相关概念;现在只需要记住抽象工厂是用来创建工厂的;
例如,QQ换皮肤的时候,有白色和黑色两个主题,没个主题对应一个工厂,白色主题的工厂产生各种白色UI组件;黑色主题的工厂将产生各种黑色主UI组件;现在需要在黑色和白色主题之间进行切换的时候,使用工厂建造者来根据不同的情况产生黑色工厂或者白色工厂;
现在来看一个具体的示例;
我们创建一个绘制图形的画板,这里存在不同形状的图形,同时图形需要不同的颜色来进行渲染;
首先定义Shape接口和Color接口,然后创建实现这些接口的具体类(这些类是颜色工厂和形状工厂创建的对象);
之后定义一个抽象超级工厂类AbstractFactory,之后定义继承抽象超级工厂的shape工厂和color工厂;(通过这个抽象超级工厂引用创建不同的工厂(形状工厂和颜色工厂))
然后便可以通过创建的工厂来创建不同的对象;
代码示例
public class AbstractFactoryPattern {
public static void main(String []args){
FactoryProducer myProducer=new FactoryProducer();
//获取工厂
AbstractFactory factory=myProducer.getFactory("Shape");//这里返回shape工厂
//通过获取的工厂创建对象
Shape shape=factory.getShape("Circle");//通过shape工厂产生circle对象
//如果生产color对象则返回null
Color color=factory.getColor("Red");
}
}
//定义形状接口,形状工厂通过该接口引用来创建形状对象
interface Shape{
}
//具体的形状类
class Circle implements Shape {
public Circle(){
System.out.println("create an circle !");
}
}
class Rectangle implements Shape{
public Rectangle(){
System.out.println("create a rectangle!!");
}
}
class Square implements Shape{
public Square(){
System.out.println("create a square!!!");
}
}
//定义颜色接口,颜色工厂通过该接口引用来创建颜色对象
interface Color{
};
//具体的颜色类
class Red implements Color{
public Red(){
System.out.println("create a red color!");
}
}
class Blue implements Color{
public Blue(){
System.out.println("create a Blue!!");
}
}
class Yellow implements Color{
public Yellow(){
System.out.println("create a yellow!!!");
}
}
//为Color和Shape对象创建抽象超级工厂类,工厂建造者将通过该对象引用获取工厂对象;
abstract class AbstractFactory{
public abstract Color getColor(String colorname);
public abstract Shape getShape(String shapename);
}
//创建shape工厂
class ShapeFactory extends AbstractFactory{
public Shape getShape(String shapename){
if (shapename==null)
return null;
if(shapename.equals("Circle"))
return new Circle();
if(shapename.equals("Square"))
return new Square();
if(shapename.equals("Rectangle"))
return new Rectangle();
return null;
}
public Color getColor(String colorname){
return null;
}
}
//创建color工厂
class ColorFactory extends AbstractFactory{
public Color getColor(String colorname){
if(colorname==null)
return null;
if(colorname.equals("Red"))
return new Red();
if(colorname.equals("Bule"))
return new Blue();
if(colorname.equals("Yellow"))
return new Yellow();
return null;
}
public Shape getShape(String shapename){
return null;
}
}
//创建工厂建造者
class FactoryProducer{
public AbstractFactory getFactory(String factorytype){
if(factorytype==null)
return null;
if(factorytype.equals("Shape"))
return new ShapeFactory();
if(factorytype.equals("Color"))
return new ColorFactory();
return null;
}
}
运行结果
"/Applications/IntelliJ IDEA.app/Contents/jbr/Contents/Home/bin/java" "-javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=61503:/Applications/IntelliJ IDEA.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath /Users/wesen/Desktop/Idea/designpatterntest/out/production/designpatterntest AbstractFactoryPattern
create an circle !
Process finished with exit code 0