抽象工厂模式介绍
抽象工厂模式与工厂方法模式虽然主要意图都是为了解决,接口选择问题。但在实现上,抽象工厂是一个中心工厂,创建其他工厂的模式
。
多个抽象产品类,派生出多个具体产品类;一个抽象工厂类,派生出多个具体工厂类;每个具体工厂类可创建多个具体产品类的实例。
即提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们的具体的类。“一对多”的关系
。
类结构图:
代码示例
项目目录结构
/**
* 水果抽象接口
*/
public interface Fruit {
void fruitInfo();
}
/**
* 具体类:北方水果
*/
public class NorthFruit implements Fruit {
@Override
public void fruitInfo() {
System.out.println("North-Apple");
}
}
/**
* 具体类:南方水果
*/
public class SouthFruit implements Fruit {
@Override
public void fruitInfo() {
System.out.println("South-Banana");
}
}
/**
* 蔬菜抽象接口
*/
public interface Vegetable {
void vegetableInfo();
}
/**
* 具体类:北方蔬菜
*/
public class NorthVegetable implements Vegetable {
@Override
public void vegetableInfo() {
System.out.println("North-Tomato");
}
}
/**
* 具体类:南方蔬菜
*/
public class SouthVegetable implements Vegetable {
@Override
public void vegetableInfo() {
System.out.println("South-Taro");
}
}
/**
* 工厂抽象接口
*/
public interface Factory {
Fruit createFruit();
Vegetable createVegetable();
}
/**
* 具体类:北方产品工厂
*/
public class NorthProductFactory implements Factory {
@Override
public Fruit createFruit() {
return new North Fruit();
}
@Override
public Vegetable createVegetable() {
return new NorthVegetable();
}
}
/**
* 具体类:南方产品工厂
*/
public class SouthProductFactory implements Factory {
@Override
public Fruit createFruit() {
return new SouthFruit();
}
@Override
public Vegetable createVegetable() {
return new SouthVegetable();
}
}
测试类
public class ApiTest {
@Test
public void testCommodity() throws Exception {
Factory northFactory = new NorthProductFactory();
Factory southFactory = new SouthProductFactory();
System.out.println("北方产品:");
northFactory.createFruit().fruitInfo();
northFactory.createVegetable().vegetableInfo();
System.out.println("南方产品:");
southFactory.createFruit().fruitInfo();
southFactory.createVegetable().vegetableInfo();
}
}
总结
- 抽象工厂模式,
所要解决的问题就是在一个产品族
,存在多个不同类型的产品情况下,接口选择的问题。而这种场景在业务开发中也是非常多见的,只不过可能有时候没有将它们抽象化出来。 - 你的代码只是被ifelse埋上了!当你知道什么场景下何时可以被抽象工程优化代码,那么你的代码层级结构以及满足业务需求上,都可以得到很好的完成功能实现并提升扩展性和优雅度。
那么这个设计模式满足了;单一职责、开闭原则、解耦等优点,但如果说随着业务的不断拓展,可能会造成类实现上的复杂度。但也可以说算不上缺点,因为可以随着其他设计方式的引入和代理类以及自动生成加载的方式降低此项缺点。