抽象工厂模式

抽象工厂模式

抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的,抽象工厂模式可以向客户端提供一个接口,使得客户端再不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象

抽象工厂模式

1. 模式中包含的角色及其职责

1.1 抽象工厂(Creator)

抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口

AnimalFactory

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/07/29
 */
public interface AnimalFactory {
    public Dog creatDog();

    public Cat createCat();
}

1.2 具体工厂(Concrete Creator)

具体工厂类是抽象工厂的一个实现,负责实例化某个产品族的产品对象

BluckAnimalFactory

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/07/29
 */
public class BluckAnimalFactory implements AnimalFactory {

    @Override
    public Dog creatDog() {
        return new BluckDog();
    }

    @Override
    public Cat createCat() {
        return new BluckCat();
    }
}

WhiteAnimalFactory

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/07/29
 */
public class WhiteAnimalFactory implements AnimalFactory {
    @Override
    public Dog creatDog() {
        return new WhiteDog();
    }

    @Override
    public Cat createCat() {
        return new WhiteCat();
    }
}

1.3 抽象(Product)

抽象模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口

Animal

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/07/29
 */
public interface Animal {
    public void eat();
}

下面这两个不算是所有对象的父类,但是产品族的两个大类(大的结构)

Dog

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/07/29
 */
public abstract class Dog implements Animal {

    @Override
    public abstract void eat();
}

Cat

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/07/29
 */
public abstract class Cat implements Animal {
    @Override
    public abstract void eat();
}

1.4 具体产品(Concrete Product)

抽象模式所创建的具体实例对象

BluckCat

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/07/29
 */
public class BluckCat extends Cat {
    @Override
    public void eat() {
        System.out.println("BluckCat eat");
    }
}

BluckDog

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/07/29
 */
public class BluckDog extends Dog {
    @Override
    public void eat() {
        System.out.println("BluckDog eat");
    }
}

WhiteCat

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/07/29
 */
public class WhiteCat extends Cat{
    @Override
    public void eat() {
        System.out.println("WhiteCat eat");
    }
}

WhiteDog

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/07/29
 */
public class WhiteDog extends Dog {
    @Override
    public void eat() {
        System.out.println("WhiteDog eat");
    }
}


抽象工厂模式

Main

package com.liuyao;

public class Main {

    public static void main(String[] args) {
        AnimalFactory factory=new BluckAnimalFactory();
        Dog dog=factory.creatDog();
        Cat cat=factory.createCat();
        dog.eat();
        cat.eat();

        AnimalFactory factory1=new WhiteAnimalFactory();
        Dog dog1=factory1.creatDog();
        Cat cat1=factory1.createCat();
        dog1.eat();
        cat1.eat();
    }
}

//    BluckDog eat
//    BluckCat eat
//    WhiteDog eat
//    WhiteCat eat

2. 总结

抽象工厂方法对应的是产品的大的结构,具体工厂对应的是产品族。