设计模式-创建型-抽象工厂模式
有点复杂。
一般的工厂模式下,每个实体类都需要一个对应的工厂,当实体类过多时工厂的数量也会变多。当实体类还有子类时,我们需要的工厂就更多了。
抽象工厂模式是将所有工厂的共性抽象出来
public interface AnimalFactory {
Animal createDog();
Animal createCat();
}
// 生产母狗和母猫
public class FemaleAnimalFactory implements AnimalFactory {
@Override
public Animal createDog() {
return new FemaleDog();
}
@Override
public Animal createCat() {
return new FemaleCat();
}
}
// 生产公狗和公猫
public class MaleAnimalFactory implements AnimalFactory {
@Override
public Animal createDog() {
return new MaleDog();
}
@Override
public Animal createCat() {
return new MaleCat();
}
}
实体类
public abstract class Animal {
// 所有的动物都会吃东西
public abstract void eat();
// 所有的动物都有性别
public abstract void gender();
}
public abstract class Cat extends Animal {
// 猫喜欢吃鱼
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
public abstract class Dog extends Animal {
// 狗喜欢吃肉
@Override
public void eat() {
System.out.println("狗吃肉");
}
}
public class FemaleCat extends Cat {
public void gender() {
System.out.println("I am a female Cat");
}
}
简单来说:工厂方法模式的工厂是创建出一种产品,而抽象工厂是创建出一类产品。
- 一类的产品我们称之为产品族。
- 猫是一类的,狗也是一类的。所以AnimalFactory定义了两类产品—>Animal createDog();和Animal createCat();
- 产品的继承结构称之为产品等级。
- 所有的狗都是会吃肉的,所以Dog实现了eat()方法
- 狗又分成了公狗和母狗,所以定义了两个类FemaleDog和MaleDog继承了Dog,实现了gender()方法
- 所有的猫都是会吃鱼的,所以Cat实现了eat()方法
- 猫又分成了公猫和母猫,所以定义了两个类FemaleCat和MaleCat继承了Cat,实现了gender()方法
- 所有的狗都是会吃肉的,所以Dog实现了eat()方法
- 具体的工厂是面向多个产品等级结构进行生产。
- 所以FemaleAnimalFactory定义了createDog()和createCat()生产母狗和母猫
- 所以MaleAnimalFactory定义了createDog()和createCat()生产公狗和共猫找到母工厂就可以创建母猫和母狗,找到公工厂就可以创建公猫和公狗
优点:
- 多了一层抽象,减少了工厂数量
缺点:
- 难以扩展