什么是抽象工厂模式
抽象工厂模式是工厂模式的一种抽象形态,通常将工厂类定义为abstract,并且在工厂的方法中,所返回的对象也是抽象的。这个返回的对象往往就是客户所需要的。
抽象工厂模式的作用
抽象工厂模式的主要作用是可以将一系列的对象系统的抽象,并将得到的抽象对象通过工厂模式进行分类。是用户使用对象时候可以更系统和清晰。
也就是说我们所要使用的对象就是抽象工厂模式生产出的产品,并且其中的生产过程或者细节都不需要我们去了解。
UML如下:
请看示例:
package pattern.abstractFactory;
//抽象工厂,注意2个方法的返回对象是具体的产品,但同样它们也是抽象的
public abstract class AbstractFactory {
public abstract Letter createLetter();
public abstract Resume createResume();
}
package pattern.abstractFactory;
//具体的Fancy工厂,重写了抽象工厂的2个方法,在这里它们做了具体的实现
public class FancyDocumentCreator extends AbstractFactory {
@Override
public Letter createLetter() {
System.out.println("Create Fancy Letter");
return new FancyLetter();
}
@Override
public Resume createResume() {
System.out.println("Create Fancy Resume");
return new FancyResume();
}
}
package pattern.abstractFactory;
//具体的Modern工厂,重写了抽象工厂的2个方法,在这里它们做了具体的实现
public class ModernDocumentCreator extends AbstractFactory {
@Override
public Letter createLetter() {
System.out.println("Create Modern Letter");
return new ModernLetter();
}
@Override
public Resume createResume() {
System.out.println("Create Modern Resume");
return new ModernResume();
}
}
package pattern.abstractFactory;
//抽象产品类Letter
public abstract class Letter {}
package pattern.abstractFactory;
//抽象产品类Resume
public abstract class Resume {}
package pattern.abstractFactory;
//抽象类Letter的子类
public class FancyLetter extends Letter {
@Override
public String toString() {
return "Fancy Letter";
}
}
package pattern.abstractFactory;
//抽象类Letter的子类
public class ModernLetter extends Letter {
@Override
public String toString() {
return "Modern Letter";
}
}
package pattern.abstractFactory;
//抽象类Resume的子类
public class FancyResume extends Resume {
@Override
public String toString() {
return "Fancy Resume";
}
}
package pattern.abstractFactory;
//抽象类Resume的子类
public class ModernResume extends Resume {
@Override
public String toString() {
return "Modern Resume";
}
}
package pattern.abstractFactory;
//客户调用类
public class AbstractFactoryDemo {
public static void main(String[] args){
//具体的调用方式,在这里可以看到用户不需要去new FancyLetter, new ModernResume,然后再set它们的属性, 这里完全由工厂来生产。
//同样也有缺陷的是模式中的工厂可以生产Letter和Resume,但是如果增加一个中其他类型的文档,则需要修改工厂的代码,这个是比较麻烦的。
AbstractFactory factory = new FancyDocumentCreator();
FancyLetter fancyLetter = (FancyLetter) factory.createLetter();
System.out.println(fancyLetter.toString());
AbstractFactory factory2 = new ModernDocumentCreator();
ModernResume modernResume = (ModernResume) factory2.createResume();
System.out.println(modernResume.toString());
}
}
上面的代码中,为清楚的说明的抽象工厂的表现形式,使用了较多的类,但是看清楚后,无论是结构还是抽象工厂模式都可以看的清楚。