设计模式之抽象工厂模式学习笔记
抽象工厂模式解决的是系列产品的问题,即工厂生产的产品本身存在着抽象且有不同的实现,此场景适合使用抽象工厂。
Coding:
1、抽象产品A系列
//定义不同的产品之间的一定具备的标准,用interface实现
//其中的method()方法可看作提取出不同产品的共性,如手机都有类似的功能
public interface IProductA {
public void method();
}
1.1、厂商1 A系列的产品
public class ProductA1 implements IProductA {
public void method() {
System.out.println("厂商1 生产**********");
}
}
1.2、厂商2 A系列的产品
public class ProductA2 implements IProductA {
public void method() {
System.out.println("厂商2 生产**********");
}
}
2、抽象产品B系列
//定义不同的产品之间的一定具备的标准,用interface实现
//其中的method()方法可看作提取出不同产品的共性,如手机都有类似的功能
public interface IProductB {
public void method();
}
2.1、厂商1 B系列的产品
public class ProductB1 implements IProductB {
@Override
public void method() {
System.out.println("厂商1 生产*******");
}
}
2.2、厂商2 B系列的产品
public class ProductB2 implements IProductB {
@Override
public void method() {
System.out.println("厂商2 生产*******");
}
}
3、抽象工厂,生成A、B系列产品
//每一种牌子的产品生产工厂,即不同的厂商负责自己牌子产品的生产
public abstract class Factory {
public abstract IProductA getProductA();
public abstract IProductB getProductB();
}
4、厂商1 生产的A、B系列的产品
//具体的工厂用来生产相关的产品
public class FactoryImpl1 extends Factory {
@Override
public IProductA getProductA() {
return new ProductA1();
}
@Override
public IProductB getProductB() {
return new ProductB1();
}
}
5、厂商2 生产的A、B系列的产品
//具体的工厂用来生产相关的产品
public class FactoryImpl2 extends Factory {
@Override
public IProductA getProductA() {
return new ProductA2();
}
@Override
public IProductB getProductB() {
return new ProductB2();
}
}
6、客户端调用工厂模式获取产品
public class Client {
public static void main(String[] args) {
Factory ff1 = new FactoryImpl1();
ff1.getProductA().method();
ff1.getProductB().method();
System.out.println("--------------------------------");
Factory ff2 = new FactoryImpl2();
ff2.getProductA().method();
ff2.getProductB().method();
}
}
针对客户端来说只需要切换抽象工厂的实现即可控制程序产生不同的系列产品,抽象工厂存在的问题,一旦系列产品比较多,那么就会存在工厂泛滥的情况。