抽象工厂模式
定义
在工厂方法中,马厂只能生产马,鸭厂只能生产鸭。但显示生活中农场不仅可以养动物还是养植物 因此抽象工厂模式就要考虑多等级产品的生产
要使用抽象工厂需要满足以下条件:
- 有多个产品族,每个具体工厂创建同一个族但不同等级的产品
- 同族产品可以一起使用
模式结构和实现
结构
- 抽象工厂:提供多个产品的接口,包含多个产品的创造方法,可以创建多个不同等级的产品
- 具体工厂:实现抽象工厂的多个抽象方法,完成具体产品的创建
- 抽象产品
- 具体产品
实现
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();
}
}