工厂方法模式通过定义一个工厂接口,将对象实例化的过程抽象出来。但是它存在一个问题,就是一个具体工厂只能创建一类产品,增加新的产品类型时,需要新增具体工厂,违反开闭原则。
那么,如果我们能有一个汽车工厂,既可以生产普通汽车,也可以生产豪华汽车,那岂不美哉?这就是抽象工厂模式要解决的问题。
抽象工厂模式(Abstract Factory Pattern)是一种软件设计模式,它属于创建型模式,其主要目的是创建一组相关或互相依赖的对象。抽象工厂模式可以对类的实例化过程进行抽象和封装,并且可以将不同类的实例化分配到不同的具体工厂中,从而使得同一个抽象工厂可以创建出不同的产品对象。
抽象工厂模式通过抽象层进行解耦,可以独立于产品类的具体实现变化,使得用户可以更加容易地切换不同的产品,而不需要修改已有系统。当需要创建一组相关的对象时,抽象工厂模式尤为合适。它可以确保同一工厂创建的对象是相互兼容、协调的。
抽象工厂模式与工厂方法模式非常相似,都用于封装对象的创建。区别在于,工厂方法模式中每一个工厂只创建一种产品,而抽象工厂模式可以创建多个相关的产品。抽象工厂也称为工厂的工厂,是工厂方法模式的升级版本。
与建造者模式的区别在于,建造者模式更注重零件的装配顺序,而抽象工厂模式更注重组合,不太关心创建步骤。和原型模式比较,原型模式用于创建单个对象,而抽象工厂用于批量创建产品。
抽象工厂模式包含以下角色:
我们用一个汽车制造的例子来说明抽象工厂的实现。这里的产品分为两大类,豪华品牌和普通品牌,每个品牌都有对应的轿车和越野车产品。
定义抽象工厂和产品接口:
interface AbstractFactory {
createSedan(): Sedan;
createSUV(): SUV;
}
interface Sedan {
showInfo(): void;
}
interface SUV {
showInfo(): void;
}
实现具体工厂:
class LuxuryFactory implements AbstractFactory {
createSedan() {
return new LuxurySedan();
}
createSUV() {
return new LuxurySUV();
}
}
class NormalFactory implements AbstractFactory {
createSedan() {
return new NormalSedan();
}
createSUV() {
return new NormalSUV();
}
}
实现具体产品:
class LuxurySedan implements Sedan {
showInfo() {
console.log('展示豪华轿车信息');
}
}
class LuxurySUV implements SUV {
showInfo() {
console.log('展示豪华 SUV 信息');
}
}
客户端代码:
const factory = new LuxuryFactory();
const sedan = factory.createSedan();
const suv = factory.createSUV();
sedan.showInfo();
suv.showInfo();
这样客户可以非常方便地切换不同的工厂来获取产品,而不需要关心产品的具体实现。
使用抽象工厂模式带来的优点包括:
但是也存在一些缺点:
所以使用时需要权衡灵活性和复杂性之间的关系,适度使用抽象工厂模式。
抽象工厂模式应用的主要场景包括:
在这些情况下,使用抽象工厂模式可以带来很大的灵活性,使得用户可以方便切换不同的产品,而不需要修改已有代码。
抽象工厂模式通过提供一个创建一组相关对象的接口,将客户端与对象的具体实现解耦,使得把兼容的对象组合在一起变得更加容易。当添加新的产品对象时,无需修改已有系统,满足开闭原则。
适用于需要创建一组相关的对象,提供最大化的灵活性和复用性的场景。但也要注意合理使用,过度使用会增加系统的复杂度。
抽象工厂模式的主要优点是封装了对象的创建过程,提高了系统的灵活性,可以轻松切换不同的产品配置。使用者无需知道具体实现。另外它也符合开闭原则,容易扩展新产品。
缺点在于过度使用会增加系统的复杂性和抽象性。而且新增产品时需要修改抽象工厂接口,不太容易实现产品的继承扩展。
主要适用于需要创建产品族的场景,需要屏蔽产品具体实现的场景,以及产品配置经常变化的场景。
总体来说,抽象工厂模式在保持系统灵活性和可扩展性方面意义重大。但也需要权衡增加的抽象性带来的复杂度。
本文标题:三言两语说透设计模式的艺术-抽象工厂模式
转载来源:http://www.shufengxianlan.com/qtweb/news40/360140.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联