抽象工厂模式(Abstract Factory)
1、基本构成
有四个角色:多个抽象产品类,多个具体产品实现类,一个抽象工厂类,多个具体工厂实现类。
2、特点
与工厂方法模式不同的是,工厂方法模式中的工厂只生产单一的产品,而抽象工厂模式中的工厂生产多个产品。
3、工厂方法模式和抽象工厂模式的区别
(1)工厂方法模式:
1.一个抽象产品类,可以派生出多个具体产品类。
2.一个抽象工厂类,可以派生出多个具体工厂类。
3.每个具体工厂类只能创建一个具体产品类的实例。
(2)抽象工厂模式:
1.多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
2.一个抽象工厂类,可以派生出多个具体工厂类。
3.每个具体工厂类可以创建多个具体产品类的实例,也就是创建的是一个产品线下的多个产品。
主要区别:
1.工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
2.工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
抽象工厂模式实例代码如下:
第一步:创建抽象产品类,可以创建多个
交通工具类:
package abstractFactory;
/**
* 抽象产品类:交通抽象类
*/
public interface Vehicle {
public void take();
}
食物类:
package abstractFactory;
/**
* 抽象产品类:食物抽象类
*/
public interface Food {
public void cook();
}
第二步:创建具体产品类,可以创建多个
package abstractFactory;
/**
* 具体产品类:交通飞机类
*/
public class Plane implements Vehicle {
@Override
public void take() {
System.out.println("飞机安全舒适!");
}
}
package abstractFactory;
/**
* 具体产品类:交通火车类
*/
public class Train implements Vehicle {
@Override
public void take() {
System.out.println("火车方便快捷!");
}
}
package abstractFactory;
/**
* 具体产品类:食物荤菜类
*/
public class Meat implements Food {
@Override
public void cook() {
System.out.println("荤菜精力充沛!");
}
}
package abstractFactory;
/**
* 具体产品类:食物素菜类
*/
public class Vegetable implements Food {
@Override
public void cook() {
System.out.println("素菜绿色健康!");
}
}
第三步:创建抽象工厂类
package abstractFactory;
/**
* 抽象工厂类
*/
public interface AbstactManager {
public Food cookFood();
public Vehicle takeVehicle();
}
第四步:创建具体工厂类,可以创建多个
package abstractFactory;
/**
* 具体工厂类1,其中Food,Vehicle是抽象类
*/
public class ConcreteManager1 implements AbstactManager {
@Override
public Food cookFood() {
return new Vegetable();
}
@Override
public Vehicle takeVehicle() {
return new Plane();
}
}
package abstractFactory;
/**
* 具体工厂类2,其中Food,Vehicle是抽象类
*/
public class ConcreteManager2 implements AbstactManager {
@Override
public Food cookFood() {
return new Meat();
}
@Override
public Vehicle takeVehicle() {
return new Train();
}
}
第五步:创建测试类
package abstractFactory;
/**
* 测试类
*/
/*public class Test {
public static void main(String[] args) {
//测试第一个具体工厂类
AbstactManager am1 = new ConcreteManager1();
//测试食物
Food food1 = am1.cookFood();
food1.cook();
//测试交通
Vehicle vehicle1 = am1.takeVehicle();
vehicle1.take();
//测试第二个具体工厂类
AbstactManager am2 = new ConcreteManager2();
//测试食物
Food food2 = am2.cookFood();
food2.cook();
//测试交通
Vehicle vehicle2 = am2.takeVehicle();
vehicle2.take();
}
}*/