设计模式:006_抽象工厂模式

51 阅读1分钟

抽象工厂模式

抽象工厂模式要解决的问题比较复杂,不但工厂是抽象的,产品是抽象的,而且有多个产品需要创建。 因此,这个抽象工厂会对应到多个实际工厂,每个实际工厂负责创建多个实际产品。 优点:解决工厂方法模式“一个具体工厂只能创建一类产品”的缺点。 缺点:抽象工厂模式很难支持新种类产品的变化。因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,违背了开闭原则。

// 多个不同的抽象产品
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();
    }
}