- 目的 :提供一个接口,用于创建相关或依赖对象的家族,而不需要指定它们的具体类。
- 核心 :抽象工厂接口声明一组创建方法,每个具体工厂实现这些方法以创建属于同一"家族"或"主题"的一组产品。
- 场景 :在图形界面设计中,可以使用抽象工厂模式来创建不同操作系统的窗口、按钮等组件。
首先有若干个产品接口
java
public interface IProduct1 {
void show();
}
java
public interface IProduct2 {
void show();
}
然后有具体的产品类实现这些接口
java
public class Product1 implements IProduct1 {
@Override
public void show() {
System.out.println("产品1");
}
}
java
public class Product1 implements IProduct2 {
@Override
public void show() {
System.out.println("产品2");
}
}
接着有若干子类继承这些产品类
java
public class GradeProduct1A extends Product1 {
@Override
public void show() {
super.show(); // 可以调用父类的方法
System.out.println("产品1的型号A");
}
}
java
public class GradeProduct1B extends Product1 {
@Override
public void show() {
super.show(); // 可以调用父类的方法
System.out.println("产品1的型号B");
}
}
java
public class GradeProduct1A extends Product2 {
@Override
public void show() {
super.show(); // 可以调用父类的方法
System.out.println("产品2的型号A");
}
}
java
public class GradeProduct1B extends Product2 {
@Override
public void show() {
super.show(); // 可以调用父类的方法
System.out.println("产品2的型号B");
}
}
核心来了,声明一个工厂接口,并在里面声明创建上面若干子类实例的方法
java
public interface IFactory {
public IProduct1 createProduct1A();
public IProduct1 createProduct1B();
public IProduct2 createProduct2A();
public IProduct2 createProduct2B();
}
最后用工厂类实现工厂接口
java
public class Factory implements IFactory {
@Override
public IProduct1 createProduct1A() {
return new GradeProduct1A();
}
@Override
public IProduct1 createProduct1B() {
return new GradeProduct1B();
}
@Override
public IProduct2 createProduct2A() {
return new GradeProduct2A();
}
@Override
public IProduct2 createProduct2B() {
return new GradeProduct2B();
}
}
在主函数调用
java
public class MainTest {
public static void main(String[] args) {
IFactory factory = new Factory(); // 先将工厂类实例化
IProduct1 product1 = factory.createProduct1A(); // 再分别创建各种产品
product1.show();
IProduct1 product12 = factory.createProduct1B();
product12.show();
IProduct2 product2 = factory.createProduct2A();
product2.show();
IProduct2 product22 = factory.createProduct2B();
product22.show();
}
}
