工廠模式
工廠模式 (Factory Pattern),根據不同的輸入返回不同類的實例,一般用來創建同一類對象。工廠方式的主要思想是將對象的創建與對象的實現分離
抽象工廠
抽象工廠 (Abstract Factory):通過對類的工廠抽象使其業務用於對產品類簇的創建,而不是負責創建某一類產品的實例。關鍵在於使用抽象類制定了實例的結構,調用者直接面向實例的結構編程,從實例的具體實現中解耦。
工廠模式,顧名思義,就相當於一間工廠,工廠可以添加不同的模具,製造不同系列的產品,比如生產飛機,大炮。
抽象工廠,顧名思義,定義的是抽象的概念,沒有定義如何實現。比如沈飛工廠生產飛機,定義抽象類“飛機”,具體實現,可以生產容量較大的C919客機,可以生產殲-20戰鬥機,B-20轟炸機。具體型號的飛機是實現,它們都符合 “飛機” 這個抽象類。
抽象類實現
/* 抽象類,ES5 構造函數方式 */
// var AbstractEs5 = function() {
// if(new.target === AbstractEs5) {
// throw new Error('抽象類不能實例化')
// }
// }
// AbstractEs5.prototype.fly = function() {
// throw new Error('抽象類方法不能調用')
// }
// 抽象工廠 飛機製造廠
class AbstractFactory {
constructor() {
if(new.target === AbstractFactory) {
throw new Error('抽象類不能實例化')
}
}
// 抽象製造方法,我只會說要造什麼,我不會造
createProduct() {
throw new Error('抽象類方法不能調用')
}
}
// 我是抽象飛機,我是一款概念產品
class AbstractPlane {
constructor(){
if(new.target === AbstractPlane) {
throw new Error('抽象類不能實例化')
}
}
fly() {
throw new Error('抽象類方法不能調用')
}
}
// 具體工廠模式,沈飛製造廠
class FactoryShenFei extends AbstractFactory {
constructor() {
super()
}
/** todo: 內部可以使用策略模式,這裏簡單用 switch-case
* 實現抽象製造方法,我知道如何造飛機,我有很多模具
*/
createProduct(type) {
switch(type) {
case 'C919客機':
return new C919Plane(type);
break;
case '殲-20戰鬥機':
return new Jian20(type);
break;
case 'B-20轟炸機':
return new B20Hong(type);
break;
default:
return new PrintWorks('工廠沒活幹就喜歡開動印鈔機');
break;
}
}
}
// 我是c919客機模具
class C919Plane extends AbstractPlane{
constructor(name) {
super()
console.log(`我是${name}具體產品`)
}
fly() {
console.log('我可以飛得很猛,載客量大,安全第一')
}
}
// 我是殲20戰鬥機模具
class Jian20 extends AbstractPlane{
constructor(name) {
super()
console.log(`我是${name}具體產品`)
}
fly() {
console.log('我可以飛得很快,咻咻咻')
}
}
// 我是B20轟炸機模具
class B20Hong extends AbstractPlane{
constructor(name) {
super()
console.log(`我是${name}具體產品`)
}
fly() {
console.log('我可以飛得很久,載蛋量大,轟轟轟')
}
}
var F1 = new FactoryShenFei()
var C9 = F1.createProduct('C919客機')
C9.fly()
var J20 = F1.createProduct('殲-20戰鬥機')
J20.fly()
var B20 = F1.createProduct('B-20轟炸機')
B20.fly()
工廠模式和抽象工廠模式的區別:
工廠模式 主要關注單獨的產品實例的創建;
抽象工廠模式 主要關注產品類簇實例的創建,如果產品類簇只有一個產品,那麼這時的抽象工廠模式就退化爲工廠模式了;
根據場景靈活使用即可。