前面写到简单工厂模式虽然比较简单,将实例的创建和使用分类,客户端只需使用由工厂类创建的对象即可,无需关心对象的创建过程。但是这个系统仍然存在问题:
1)工厂类过于庞大,包含了大量的if判断语句代码,导致维护和测试难度增加;
2)当前只存在一个工厂类,在需要添加新产品时,由于静态工厂方法通过传入参数创建不同的产品,必须修改工厂了的源码,违背了开闭原则。
对此,需要对简单工厂模式进行优化,使其具有更好的灵活性和扩展性。这也是工厂方法模式的由来。
工厂方法模式(Factory Method Pattern)是简单工厂模式的进一步抽象和推广。在工厂方法模式中,不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同产品提供不同的工厂,使每个工厂只负责创建对应的产品。
工厂方法模式,是对简单工厂模式进行重构,即定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。
工厂方法模式包含以下主要角色:
工厂方法模式的主要优点:
可能的缺点:
我们使用 Typescript 代码来实现一个简单的工厂方法模式:
首先定义抽象产品类和具体产品类:
interface Food {
getType(): string;
}
class Hamburger implements Food {
getType() {
return 'Hamburger';
}
}
class Hotdog implements Food {
getType() {
return 'Hotdog';
}
}
然后是抽象工厂类和具体工厂类:
abstract class FoodFactory {
abstract createFood(): Food;
}
class HamburgerFactory extends FoodFactory {
createFood() {
return new Hamburger();
}
}
class HotdogFactory extends FoodFactory {
createFood() {
return new Hotdog();
}
}
客户端代码:
const hamburgerFactory = new HamburgerFactory();
const hamburger = hamburgerFactory.createFood();
const hotdogFactory = new HotdogFactory();
const hotdog = hotdogFactory.createFood();
客户端通过具体工厂来获取需要的产品,不关心实际产品类名。
我们可以使用泛型来定义产品类型:
interface FoodFactory {
createFood(): T;
}
// 实现时指定泛型
class HamburgerFactory implements FoodFactory {
// ...
}
这样可以使工厂方法返回类型更加明确。
工厂方法也可以简单实现为函数:
function createFood(type: 'Hamburger' | 'Hotdog') {
switch(type) {
case 'Hamburger':
return new Hamburger();
case 'Hotdog':
return new Hotdog();
}
}
这种方式更简单,降低了代码的复杂度,但缺少面向对象的灵活性。
简单工厂模式中工厂类负责所有产品的创建;而工厂方法模式中每一个具体工厂类只负责创建对应的一个产品,它将产品的创建推迟到子类。
两者区别主要在:
简单工厂适合产品种类少的情况,工厂方法适合产品不断扩展的场景。
我们可以使用工厂方法模式实现一个游戏工厂,用于生成不同类型的游戏对象。
首先是游戏基类和具体游戏类:
interface Game {
start();
}
class RPG implements Game {
start() {
console.log('Starting RPG game');
}
}
class MMORPG implements Game {
start() {
console.log('Starting MMORPG game');
}
}
然后是抽象工厂和具体工厂:
abstract class GameFactory {
abstract createGame(): Game;
}
class RPGFactory extends GameFactory {
createGame() {
return new RPG();
}
}
class MMORPGFactory extends GameFactory {
createGame() {
return new MMORPG();
}
}
客户端代码:
const rpgFactory = new RPGFactory();
const rpgGame = rpgFactory.createGame();
rpgGame.start();
const mmorpgFactory = new MMORPGFactory();
const mmorpgGame = mmorpgFactory.createGame();
mmorpgGame.start();
客户端只需要关心游戏类型,而不关心具体类名。
工厂方法模式是一种广泛使用的设计模式,它具有以下核心特点:
综上,工厂方法模式通过面向对象封装了对象创建过程,实现低耦合、高内聚的代码,给系统提供了灵活的产品扩展方式,是非常流行与常用的设计模式。
本文题目:三言两语说透设计模式的艺术-工厂方法模式
URL标题:http://www.shufengxianlan.com/qtweb/news15/414465.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联