提供一系列创建相关或相互依赖的接口,而无需指定他们具体的类。--《设计模式》
开发过程中都经常会碰到这么一种情况,我需要系列的不同类型的组件,例如有一堆轮胎、一堆发动机;轮胎有汽车和摩托车两种类型,发动机也是汽车和摩托两种类型。这时候我们可以用两个工厂类进行封装,但是当我们引入卡车的轮胎和发动机的时候,两个工厂都得修改。那么,这个时候,抽象工厂类型就更能适应变化和进行类型归类了。
抽象模式跟工厂模式的主要区别,抽象工厂模式主要是工厂层面也是抽象的,同一个例如汽车工厂、卡车工厂;而工厂模式主要提供单一的产品,例如轮胎专业厂商。
假设我们现在有两个工厂——汽车和卡车工厂,每个工厂都生产轮胎和发动机。那么抽象如下:
有两个实例工厂,每个工厂都能生产对应的Tyre(轮胎)和Engine(发动机),相关代码如下:
Tyre类型
// Tyre.swift
protocol ITyre {
func description() -> String;
}
// CarTyre.swift
class CarTyre : ITyre {
func description() -> String {
return "this is a CarTyre...";
}
}
// TruckTyre.swift
class CarTyre : ITyre {
func description() -> String {
return "this is a CarTyre...";
}
}
Engine类型
// IEngine.swift
protocol IEngine {
func description()->String;
}
// CarEngine.swift
class CarEngine : IEngine {
func description() -> String {
return "this is a carEngine...";
}
}
// TruckEngine.swift
class TruckEngine : IEngine {
func description() -> String {
return "this is a truckEngine...";
}
}
工厂类型:
// IvehicleFactory.swift
protocol IVehicleFactory {
func createTyre() -> ITyre ;
func createEngine() -> IEngine;
}
// CarFactory.swift
class CarFactory : IVehicleFactory {
func createTyre() -> ITyre {
return CarTyre();
}
func createEngine() -> IEngine {
return CarEngine();
}
}
// TruckFactory.swift
class TruckFactory : IVehicleFactory {
func createTyre() -> ITyre {
return TruckTyre();
}
func createEngine() -> IEngine {
return TruckEngine();
}
}
// main.swift
func descriptionComponent(factory : IVehicleFactory) {
println(factory.createTyre().description());
println(factory.createEngine().description());
}
var carFactory : IVehicleFactory = CarFactory();
descriptionComponent(carFactory);
descriptionComponent(TruckFactory());
打印结果如下: