Appearance
抽象工厂模式
定义
抽象工厂模式(Abstract Factory Pattern)是创建型设计模式之一。抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
适用场景
- 当一个系统需要独立于它的产品的创建、组合和表示时。
- 当一个系统要由多个产品系列中的一个来配置时。
- 当一个系统需要由多个产品系列中的一个来配置时。
- 当一个系统需要由多个产品系列中的一个来配置时。
优点
- 抽象工厂模式可以将产品族的依赖关系延迟到子类,从而实现解耦。
- 抽象工厂模式可以很方便地增加新的产品族,只需增加新的具体工厂类即可。
- 抽象工厂模式可以很方便地增加新的产品,只需增加新的具体产品类即可。
缺点
- 抽象工厂模式需要创建多个具体工厂类,增加了系统的复杂度。
- 抽象工厂模式需要定义多个抽象产品类,增加了系统的复杂度。
- 抽象工厂模式难以支持新种类的产品,因为需要修改抽象工厂接口和所有具体工厂类。
代码示例
一个副职业职业工厂,生产不同类型的职业,如铁匠、裁缝
java
public interface Profession {
void work();
}
public class Blacksmith implements Profession {
@Override
public void work() {
System.out.println("铁匠工作,生产武器装备");
}
}
public class Tailor implements Profession {
@Override
public void work() {
System.out.println("裁缝工作,生产衣服裤子");
}
}
public interface Creation {
String getName();
}
public class Sword implements Creation {
@Override
public String getName() {
return "剑";
}
}
public class Sabre implements Creation {
@Override
public String getName() {
return "战刀";
}
}
public class Jacket implements Creation {
@Override
public String getName() {
return "夹克";
}
}
public class Trousers implements Creation {
@Override
public String getName() {
return "裤子";
}
}
定义工厂
java
public interface ProfessionFactory {
Profession createProfession();
Creation createCreation();
}
public class BlacksmithFactory implements ProfessionFactory {
@Override
public Profession createProfession() {
return new Blacksmith();
}
@Override
public Creation createCreation() {
return Math.random() > 0.5 ? new Sword() : new Sabre();
}
}
public class TailorFactory implements ProfessionFactory {
@Override
public Profession createProfession() {
return new Tailor();
}
@Override
public Creation createCreation() {
return Math.random() > 0.5 ? new Jacket() : new Trousers();
}
}
使用
java
public class TwoMain {
public static void main(String[] args) {
ProfessionFactory blacksmithFactory = new BlacksmithFactory();
Profession blacksmith = blacksmithFactory.createProfession();
Creation weapon = blacksmithFactory.createCreation();
blacksmith.work();
System.out.println(weapon.getName());
ProfessionFactory tailorFactory = new TailorFactory();
Profession tailor = tailorFactory.createProfession();
Creation clothing = tailorFactory.createCreation();
tailor.work();
System.out.println(clothing.getName());
}
}
结果
txt
铁匠工作,生产武器装备
战刀
裁缝工作,生产衣服裤子
夹克