设计模式:抽象工厂模式

2,150 阅读1分钟

抽象工厂模式

定义

在工厂方法中,马厂只能生产马,鸭厂只能生产鸭。但显示生活中农场不仅可以养动物还是养植物 因此抽象工厂模式就要考虑多等级产品的生产

要使用抽象工厂需要满足以下条件:

  • 有多个产品族,每个具体工厂创建同一个族但不同等级的产品
  • 同族产品可以一起使用

模式结构和实现

结构

  • 抽象工厂:提供多个产品的接口,包含多个产品的创造方法,可以创建多个不同等级的产品
  • 具体工厂:实现抽象工厂的多个抽象方法,完成具体产品的创建
  • 抽象产品
  • 具体产品

image.png

实现

package AbstractFactory;


/**
 * @author richard
 * @date 2021年11月23日 15:48:00
 * @description TODO
 */
public class FarmTest {
    public static void main(String[] args) {
        Farm sh=new SHFarm();
        Duck duck= (Duck) sh.newAnimal();
        duck.shout();
        Fruit tomoto= (Fruit) sh.newPlant();
        tomoto.show();
    }
}
    /**
     * 抽象产品:动物类
     */
    interface Animal{
        public void shout();
    }
    /**
     * 抽象产品:植物类
     */
    interface Plant{
        public  void show();
    }
    /**
     * 具体产品:马
     */
    class Horse implements Animal {
        @Override
        public void shout() {
            System.out.println("马叫ing");
        }
    }
    /**
     * 具体产品:鸭
     */
    class Duck implements Animal {
        @Override
        public void shout() {
            System.out.println("小鸭叫ing");
        }
    }
    /**
     * 具体产品:水果
     */
    class Fruit implements Plant{
        @Override
        public void show() {
            System.out.println("水果长大了");
        }
    }
    /**
     * 具体产品:蔬菜
     */
    class Vegetable implements Plant{
        @Override
        public void show() {
            System.out.println("蔬菜可以吃了");
        }
    }
    /**
     * 抽象工厂
     */
    interface Farm{
        public  Animal newAnimal();
        public  Plant newPlant();
    }
/**
 * 具体工厂:上海农场
 */
class SHFarm implements Farm {
    @Override
    public Animal newAnimal() {
        System.out.println("小鸭出生");
        return new Duck();
    }

    @Override
    public Plant newPlant() {
        System.out.println("水果可以吃了");
        return new Fruit();
    }
}
/**
 * 具体工厂:内蒙古农场
 */
class NMGFarm implements Farm{
    @Override
    public Animal newAnimal() {
        System.out.println("马出生");
        return new Horse();
    }

    @Override
    public Plant newPlant() {
        System.out.println("蔬菜可以吃了");
        return new Vegetable();
    }
}