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

来源:互联网 发布:耶律大石 知乎 编辑:程序博客网 时间:2024/06/15 15:15

一、典型的应用场景

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


二、结构图



三、优缺点

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();    }}



0 0
原创粉丝点击