定义
抽象工厂模式是指提供一系列相互依赖或者相关的接口,无需指定他们具体的类。客户端(应用层)不依赖于产品实例如何被创建的细节。强调的是一系列相关的产品对象一起使用创建对象需要大量重复的代码,需要提供一个产品类的库。所以的产品以同样的接口出现,从而使客户端不依赖于具体的实现。
举例
场景
有一个支付场景,要支付宝支付和微信支付,支付宝支付和微信支付都可以聊天,都可以借钱(假设)。
步骤
- 创建抽象的聊天和借钱的接口,提供抽象的聊天和借钱的方法。
package com.gupao.vip.pay.abstractfactory;
public interface ITalk {
void talk();
}package com.gupao.vip.pay.abstractfactory;
public interface ILend {
void lend();
}- 创建支付的抽象 工厂类,提供公开的初始化方法,提供抽象的创造聊天和支付的方法,返回值是抽象的聊天和借钱。
package com.gupao.vip.pay.abstractfactory;
public abstract class PayFactory {
public void init(){
System.out.println("初始化数据");
}
protected abstract ITalk createTalk();
protected abstract ILend createLend();
}package com.gupao.vip.pay.abstractfactory;
public class AliPayTalk implements ITalk {
@Override
public void talk() {
System.out.println("支付宝聊天");
}
}package com.gupao.vip.pay.abstractfactory;
public class WechatTalk implements ITalk {
@Override
public void talk() {
System.out.println("微信可以聊天");
}
}package com.gupao.vip.pay.abstractfactory;
public class WechatLend implements ILend {
@Override
public void lend() {
System.out.println("微信可以借钱");
}
}- 创建阿里支付工厂和微信支付工厂,继承支付工厂接口,实现其抽象的方法。在方法中创建具体的聊天和借钱的实例。
package com.gupao.vip.pay.abstractfactory;
public class AliPayFactory extends PayFactory {
@Override
protected ITalk createTalk() {
super.init();
return new AliPayTalk();
}
@Override
protected ILend createLend() {
super.init();
return new AliPayLend();
}
}package com.gupao.vip.pay.abstractfactory;
public class WechatPayFactory extends PayFactory {
@Override
protected ITalk createTalk() {
super.init();
return new WechatTalk();
}
@Override
protected ILend createLend() {
super.init();
return new WechatLend();
}
}- 在客户端创建支付宝支付和微信支付的工厂,调用工厂的创建聊天和借钱的接口创建具体的聊天和借钱的实例,最后调用聊天和借钱的方法。
package com.gupao.vip.pay.abstractfactory;
public class Test {
public static void main(String[] args) {
AliPayFactory aliPayFactory = new AliPayFactory();
aliPayFactory.createTalk().talk();
aliPayFactory.createLend().lend();
System.out.println("---------");
WechatPayFactory wechatPayFactory = new WechatPayFactory();
wechatPayFactory.createTalk().talk();
wechatPayFactory.createLend().lend();
}
}总结
不知道大家有没有发现,如果在上面的代码中,需要给阿里支付和微信支付添加额外的功能,则需要改变抽象工厂和具体工厂的代码。这样就违背的软件设计的开闭原则。所以抽象工厂模式也是有缺点的。第一,产品族需要扩展功能很麻烦,需要修改抽象接口的代码。第二,创建的抽象类多,增加了系统的抽象性和理解难度。
5 条评论
2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
新车首发,新的一年,只带想赚米的人coinsrore.com
新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
新车上路,只带前10个人coinsrore.com
新盘首开 新盘首开 征召客户!!!coinsrore.com
新项目准备上线,寻找志同道合 的合作伙伴coinsrore.com
新车即将上线 真正的项目,期待你的参与coinsrore.com
新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com
文章深入浅出,既有深度思考,又不乏广度覆盖,令人叹为观止。
作者以非凡的视角解读平凡,让文字焕发出别样的光彩。
以小见大,从平凡事物中提炼普世价值。
反讽手法运用娴熟,令人会心一笑。