《设计模式》第三章——Abstract Factory模式

一、典型的应用场景

现在有一套产品系列抽象接口:A,B,C,D,并且有两套以上的实现这些抽象接口的具体产品系列,比如说具体产品系列1:1A,1B,1C,1D和具体产品系列2:2A,2B,2C,2D
用户直接跟产品系列抽象接口A,B,C,D交互,具体的产品系列在别处指定,现在需要能够方便无痕地从具体产品系列1转换到具体产品系列2


二、结构图

《设计模式》第三章——Abstract Factory模式_第1张图片


三、优缺点

1)分类了具体的类,客户只与抽象接口进行交互

2)易于切换产品系列,比如本来使用的是Window窗口系统下的组件,可以很容易切换到使用X窗口系统下的组件

3)有利于产品的一致性,比如要么都是Window窗口系统下的组件,要么都是X窗口系统下的组件,不可能是一部分组件属于Window窗口系统,另外一部分属于X窗口系统

4)难以支持新种类的产品,要增加一个产品种类,得在抽象工厂类中增加相应的getXXX()方法,然后所有的具体工厂类中都得实现相应的getXXX()方法


四、代码实例

package designPattern;

interface Animal {
    void print();
}


interface Tool {
    void print();
}


interface AbstractFactory {
    Animal getAnimal();

    Tool getTool();
}


class Dog implements Animal {
    public void print() {
        System.out.println("I am a dog");
    }
}


class Cat implements Animal {
    public void print() {
        System.out.println("I am a cat");
    }
}


class Knife implements Tool {
    public void print() {
        System.out.println("I am a knife");
    }
}


class Scissor implements Tool {
    public void print() {
        System.out.println("I am a scissor");
    }
}


class ConcreteFactory1 implements AbstractFactory {
    public Dog getAnimal() {
        return new Dog();
    }

    public Knife getTool() {
        return new Knife();
    }
}


class ConcreteFactory2 implements AbstractFactory {
    public Cat getAnimal() {
        return new Cat();
    }

    public Scissor getTool() {
        return new Scissor();
    }
}


public class AbstractFactoryExample {
    public static void main(String[] args) {
        AbstractFactoryExample example = new AbstractFactoryExample();
        example.run(new ConcreteFactory1());
        example.run(new ConcreteFactory2());
    }

    public void run(AbstractFactory factory) {
        factory.getAnimal().print();
        factory.getTool().print();
    }
}



你可能感兴趣的:(《设计模式》第三章——Abstract Factory模式)