抽象工厂模式
抽象工厂模式要解决的问题比较复杂,不但工厂是抽象的,产品是抽象的,而且有多个产品需要创建。 因此,这个抽象工厂会对应到多个实际工厂,每个实际工厂负责创建多个实际产品。 优点:解决工厂方法模式“一个具体工厂只能创建一类产品”的缺点。 缺点:抽象工厂模式很难支持新种类产品的变化。因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,违背了开闭原则。
// 多个不同的抽象产品
public interface HtmlDocument {
void toHtml();
void show();
}
public interface WordDocument {
void toWord();
void show();
}
// 单个抽象产品,有多个具体实现
public class FastHtmlDocument implements HtmlDocument {
@Override
public void toHtml() {
System.out.println("FastHtmlDocument toHtml");
}
@Override
public void show() {
System.out.println("FastHtmlDocument show");
}
}
public class FastWordDocument implements WordDocument {
@Override
public void toWord() {
System.out.println("FastWordDocument toWord");
}
@Override
public void show() {
System.out.println("FastWordDocument show");
}
}
public class GoodHtmlDocument implements HtmlDocument {
@Override
public void toHtml() {
System.out.println("GoodHtmlDocument toHtml");
}
@Override
public void show() {
System.out.println("GoodHtmlDocument show");
}
}
public class GoodWordDocument implements WordDocument {
@Override
public void toWord() {
System.out.println("GoodWordDocument toWord");
}
@Override
public void show() {
System.out.println("GoodWordDocument show");
}
}
// 抽象工厂创建多个抽象产品
public interface Factory {
HtmlDocument createHtml();
WordDocument createWord();
}
// 具体工厂,创建具体的多个产品
public class FastFactory implements Factory {
@Override
public HtmlDocument createHtml() {
return new FastHtmlDocument();
}
@Override
public WordDocument createWord() {
return new FastWordDocument();
}
}
public class GoodFactory implements Factory {
@Override
public HtmlDocument createHtml() {
return new GoodHtmlDocument();
}
@Override
public WordDocument createWord() {
return new GoodWordDocument();
}
}