工厂的作用就是生产实例,但其与构造函数不同。工厂是用来生产多种类型实例的。例如,麦当劳可以生产汉堡,薯条和可乐,再例如,美的可以生产冰箱,洗衣机,和空调等。工厂生产的产品必须要用相关性,属于一个产品族或者属于多个相近的产品族。
工厂模式分为三种,分别是
1. 简单工厂,通过switch语句根据产品标识生产不同类型的产品,直接调用各种产品的构造函数
2. 工厂,对简单工厂的优化,将工厂进行抽象,新增产品只需增加指定工厂和产品,不需要修改单一工厂的switch语句,不会影响其他产品
3. 抽象工厂,比工厂模式多的就是,可以生产多个产品族,就是一个工厂可以同时生产多个产品,而普通工厂只能生产一个产品
(ES6)代码实现如下:
1.简单工厂
class SimpleFactory{ constructor(prodNo) //构造工厂时告知工厂产品标识 { this.prodNo = prodNo; } GetProduct() { switch (this.prodNo) //根据产品标识生产产品 { default: return new ProductA(); case 1: return new ProductA(); case 2: return new ProductB(); } } } //产品接口 class IProduct { //产品方法 //...... } //产品A class ProductA extends IProduct { //产品属性 //...... } //产品B class ProductB extends IProduct { //产品属性 //...... }
2.工厂模式
class IFactory //工厂接口 { GetProduct(){ } } //A工厂类 class FactoryA extends IFactory { constructor() { this.productA = new ProductA(); } //A工厂生产A产品 GetProduct() { return this.productA; } } //B工厂类 class FactoryB extends IFactory { constructor() { this.productB = new ProductB(); } //B工厂生产B产品 GetProduct() { return this.productB; } } //产品接口 class IProduct { //产品方法 //...... } //产品A class ProductA extends IProduct { //产品属性 //...... } //产品B class ProductB extends IProduct { //产品属性 //...... }
3.抽象工厂
//工厂接口,即抽象工厂 class IFactory { CreateFridge(); CreateAirCondition(); } //三星的工厂,生产三星的产品族 class SamsungFactory extends IFactory { CreateAirCondition() { return new SamsungAirCondition(); //三星的工厂生产三星的空调 } CreateFridge() { return new SamsungFridge(); //三星的工厂生产三星的冰箱 } } //格力的工厂,生产格力的产品族 class GreeFactry extends IFactory { CreateAirCondition() { return new GreeAirCondition(); //格力的工厂生产格力的空调 } CreateFridge() { return new GreeFridge(); //格力的工厂生产格力的冰箱 } } //冰箱产品接口 class IFridge { //冰箱产品接口 //冰箱的action } //空调接口 class IAirCondition { //空调产品接口 //空调的action } //三星的冰箱 class SamsungFridge extends IFridge { //三星冰箱的action和property } //格力的冰箱 class GreeFridge extends IFridge { //格力冰箱的action和property } //三星的空调 class SamsungAirCondition extends IAirCondition { //三星空调的action和property } //格力的空调 class GreeAirCondition extends IAirCondition { //格力空调的action和property }
参考:http://blog.jobbole.com/109594/