工厂模式(三):抽象工厂模式

抽象工厂模式
1 介绍
在工厂方法模式中,其实我们有一个潜在意识的意识。那就是我们生产的都是同一类产品。
抽象工厂模式是工厂方法的仅一步深化,在这个模式中的工厂类不单单可以创建一种产品,而是可以创建一组产品。
2 适用场景
和工厂方法一样客户端不需要知道它所创建的对象的类。
需要一组对象共同完成某种功能时,并且可能存在多组对象完成不同功能的情况。(同属于同一个产品族的产品)
系统结构稳定,不会频繁的增加对象。(因为一旦增加就需要修改原有代码,不符合开闭原则)
3 抽象工厂方法模式角色分配:
抽象工厂(AbstractFactory)角色 :是工厂方法模式的核心,与应用程序无关。
                                 任何在模式中创建的对象的工厂类必须实现这个接口。
具体工厂类(ConreteFactory)角色 :这是实现抽象工厂接口的具体工厂类,
                                 包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建某一种产品对象。
抽象产品(Abstract Product)角色 :工厂方法模式所创建的对象的超类型,
                                 也就是产品对象的共同父类或共同拥有的接口。
具体产品(Concrete Product)角色 :抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。
                                 在抽象工厂中创建的产品属于同一产品族,这不同于工厂模式中的工厂只创建单一产品。

1、创建相关的接口

/**
 * 动物接口
 *
 * @Author: chenqi
 * @Date: 2019.8.27 17:04
 */
public interface Animal {
    void eat();
}

/**
 * 食物接口
 *
 * @Author: chenqi
 * @Date: 2019.8.27 17:05
 */
public interface Food {
    void food();
}

2.创建接口的实现类

/**
 * 猫
 *
 * @Author: chenqi
 * @Date: 2019.8.27 17:05
 */
public class Cat implements Animal {

    @Override
    public void eat() {
        System.out.println("cat eat fish");
    }
}

/**
 * 狗
 *
 * @Author: chenqi
 * @Date: 2019.8.27 17:06
 */
public class Dog implements Animal {

    @Override
    public void eat() {
        System.out.println("shit");
    }
}

/**
 * 鱼
 *
 * @Author: chenqi
 * @Date: 2019.8.27 17:08
 */
public class Fish implements Food {
    @Override
    public void food() {
        System.out.println("fish");
    }
}

/**
 * 翔
 *
 * @Author: chenqi
 * @Date: 2019.8.27 17:08
 */
public class Shit implements Food {
    @Override
    public void food() {
        System.out.println("shit");
    }
}

3.工厂接口

/**
 * @Author: chenqi
 * @Date: 2019.8.27 17:09
 */
public interface Factory {
    Animal animalEat();
    Food animalFood();
}

4.工厂接口实现类

/**
 * 猫工厂
 *
 * @Author: chenqi
 * @Date: 2019.8.27 17:10
 */
public class CatFactory implements Factory {
    @Override
    public Animal animalEat() {
        return new Cat();
    }
    @Override
    public Food animalFood() {
        return new Fish();
    }
}

/**
 * 狗工厂
 *
 * @Author: chenqi
 * @Date: 2019.8.27 17:10
 */
public class DogFactory implements Factory {
    @Override
    public Animal animalEat() {
        return new Dog();
    }
    @Override
    public Food animalFood() {
        return new Shit();
    }
}

5.测试

public class Test {
    public static void main(String[] args) {
        Factory factory = new CatFactory();
        Animal animal = factory.animalEat();
        Food food = factory.animalFood();
        animal.eat();
        food.food();
    }
}
// 输出
// cat eat fish
// fish
Last modification:October 24th, 2019 at 01:58 pm