抽象工厂模式
抽象工厂模式是能方便的创建一系列相关对象,而无需关心其具体类,客户端只需调用不同类别的工厂函数即可创建不同类别的一系列产品,比如:
桌子
+椅子
汽车
+方向盘
等等
强调一系列,需要区别于工厂模式:父类提供创建对象接口,由子类决定创建对象类型
例子
假设有工厂需要生产桌子和椅子,有欧式风格和中式风格两种,并且中式风格和欧式风格不能混入,并且在不久的将来可能还会出现其他风格的产品。该例子我们就可以使用抽象工厂模式设计,通过不同的工厂生产不同风格的产品。
// 声明工厂函数,均需要生产椅子和桌子
interface AbstractFactory{
createChair():AbstractChair;
createTable():AbstractTable;
}
// 中国工厂
class ChinaFactory implements AbstractFactory {
public createChair():AbstractChair {
return new ChinaChair();
}
public createTable():AbstractTable {
return new ChinaTable();
}
}
// 欧洲工厂
class EuropeFactory implements AbstractFactory{
public createChair():AbstractChair {
return new EuropeChair();
}
public createTable():AbstractTable {
return new EuropeTable();
}
}
interface AbstractChair{
useChair():string;
}
interface AbstractTable{
useTable():string;
}
class EuropeChair implements AbstractChair{
public useChair():string{
return '这是欧洲椅子';
}
}
class EuropeTable implements AbstractTable{
public useTable():string{
return '这是欧洲桌子';
}
}
class ChinaChair implements AbstractChair{
public useChair():string{
return '这是中国椅子';
}
}
class ChinaTable implements AbstractTable{
public useTable():string{
return '这是中国桌子';
}
}
function client(factory:AbstractFactory){
const chair:AbstractChair = factory.createChair();
const table:AbstractTable = factory.createTable();
console.log(chair.useChair());
console.log(table.useTable());
}
// 中国工厂生产
client(new ChinaFactory());
console.log('-------')
// 欧洲工厂生产
client(new EuropeFactory());