虫虫的技术博客 技术 生活

Sunday, May 12, 2019

设计模式-抽象工厂

        工厂方法模式中,工厂类用于生成一系列对象实例并且以这些对象的父级类型作为返回结果。当有多个这样的工厂,这些工厂之间会生产出一系列不同的对象,这种情况下,我们可以定义一个抽象工厂来描述工厂的行为,即创建一系列对象的方法,再让具体的工厂类继承这个抽象工厂。也可以说是把一个系列的工作抽象出来一个抽象的类型,这个抽象的类型就是抽象工厂。

先来看一下结构图:

下面来看一下具体代码:
定义抽象类型
public interface Animal {
    void say();}

public interface Cat extends Animal {
}

public interface Dog extends Animal {
}

public interface Duck extends Animal {
}

定义抽象工厂接口
public interface AnimalFactory {
    /**     * 抽象工厂方法     * 特点与工厂方法一致:     * 创建了一个对象     * 返回类型为一个接口或者抽象类     * 有多个类实现了上述抽象类型     *     * @param animalType     * @return     */    Animal getAnimal(String animalType);}

抽象类型的具体类与具体工厂类(US)
public class CatUs implements Cat {
    @Override    public void say() {
        System.out.println("america cat");    }
}

public class DogUs implements Dog {
    @Override    public void say() {
        System.out.println("america dog");    }
}

public class DuckUs implements Duck {
    @Override    public void say() {
        System.out.println("america duck");    }
}

public class AnimalFactoryUs implements AnimalFactory {
    @Override    public Animal getAnimal(String animalType) {
        if ("dog".equals(animalType)) {
            return new DogUs();        } else if ("cat".equals(animalType)) {
            return new CatUs();        } else if ("duck".equals(animalType)) {
            return new DuckUs();        } else {
            return null;        }
    }
}

抽象类型的具体类与具体工厂类(CHINA)
public class CatChina implements Cat {
    @Override    public void say() {
        System.out.println("china duck");    }
}

public class DogChina implements Dog {
    @Override
    public void say() {
        System.out.println("china dog");    }
}

public class DogChina implements Dog {
    @Override
    public void say() {
        System.out.println("chinese dog");    }
}

public class DuckChina implements Duck {
    @Override    public void say() {
        System.out.println("china cat");    }
}

public class AnimalFactoryChina implements AnimalFactory {
    @Override    public Animal getAnimal(String animalType) {
        if ("dog".equals(animalType)) {
            return new DogChina();        } else if ("cat".equals(animalType)) {
            return new CatChina();        } else if ("duck".equals(animalType)) {
            return new DuckChina();        } else {
            return null;        }
    }
}

测试主类
public class AnimalfactoryDemo {
    public static void main(String[] args) {
        AnimalFactoryChina animalFactoryChina = new AnimalFactoryChina();        animalFactoryChina.getAnimal("dog").say();
        AnimalFactoryUs animalFactoryUs = new AnimalFactoryUs();        animalFactoryUs.getAnimal("dog").say();    }
}

代码地址
https://github.com/angelala00/learn/tree/master/src/main/java/cn/jc/designpattern/abstractfactory

再多说一点
在研究抽象工厂的时候,也参考了多个网上搜索到的文章,记得有一篇是https://www.runoob.com/design-pattern/abstract-factory-pattern.html,看过之后总觉得不是很理想,文章中的代码看起来也是抽象工厂的逻辑和结构,然而某一个具体的工厂却有闲置的方法,比如ShapeFactory的getColor方法,这样在使用者看来,总会产生一些困惑,所以又找了纸质书资料,最终参考了《设计模式Java手册》中关于抽象工厂模式的讲解,并且把其中的代码实现了(地址:https://github.com/angelala00/learn/tree/master/src/main/java/cn/jc/designpattern/abstractfactory1)之后,觉得这里说的案例,更能准确的描述抽象工厂。于是有了本文的Demo。

JDK中抽象工厂的身影:
java.sql.Driver的connect方法。
Connection为connect方法返回的抽象类型。在java.sql.Driver中,没有给出具体的工厂类,而是由DriverManager来管理,动态注册到一个工厂集合中。



0 comments:

Post a Comment

Popular Posts

Copyright © 虫虫的成长历程 | Powered by Blogger Design by PWT | Blogger Theme by NewBloggerThemes.com