三种工厂设计模式
三种工厂模式
我们平时说的工厂设计模式包含简单工厂工厂模式,工厂方法模式和抽象工厂模式。
总结就是如下:
- 简单工厂:一个工厂类仅有1个生产方法,可以依据产品类型,生产一系列的多种产品。
- 工厂方法:一个工厂类仅有1个生产方法,仅能生产一种商品。但是可以多个工厂类。
- 抽象工厂:一个工厂类可以有多个生产方法,每个生产方法仅能生产1个系列的产品。
简单工厂
- 优点
简单工厂,顾名思义简单,开发起来迅速。
Show Me The Code
interface Phone { } class MiPhone implements Phone { } class IPhone implements Phone { } public class SimplePhoneFactory { public static Phone build(String type) { if ("mi".equals(type)) { return new MiPhone(); } else if ("apple".equals(type)) { return new IPhone(); } // "还不支持代工这个手机品牌" return null; } } // 生产一台小米手机 Phone miPhone = SimplePhoneFactory.build("mi"); // 生产一台苹果手机 Phone iphone = SimplePhoneFactory.build("apple");
那生产一台魅族手机呢?是不是去生产方法里,添加魅族的类型即可呢。确实是这样。
那有没有到他的缺点呢?不遵循开闭原则,开闭原则讲的是对扩展开放,对修改关闭。我们新增魅族就是扩展,增加就要修改旧方法,那就不符合修改关闭原则。
工厂方法
- 特点
工厂方法,准确来说应该叫做抽象工厂方法。因为本类不负责生产对象,而将生产对象的任务交给子类来完成。
大家看到这里有没有觉得跟模板方法相似,模板方法也是本类中定义好流程,具体的实现交给子类来完成。
既然叫工厂方法,重点就在子类实现工厂方法。
Show Me The Code
public class PhoneFactory { public abstract Phone build(); } class MiFactory extends PhoneFactory { @Override public Phone build() { return new MiPhone(); } } class AppleFactory extends PhoneFactory { @Override public Phone build() { return new IPhone(); } } // 生产一台小米手机 Phone miPhone = new MiFactory().build(); // 生产一台苹果手机 Phone iphone = new AppleFactory().build();
看到工厂方法的优势了吧,假如要生产魅族手机,只需要新增一个魅族手机工厂即可。不要修改旧代码。
抽象工厂
Show Me The Code
interface Pad { } class MiPad implements Pad { } class IPad implements Pad { } public abstract class AbstractFactory { public abstract Phone buildPhone(); public abstract Pad buildPad(); } class MiFactory extends AbstractFactory { @Override public Phone buildPhone() { return new MiPhone(); } @Override public Pad buildPad() { return new MiPad(); } } class AppleFactory extends AbstractFactory { @Override public Phone buildPhone() { return new IPhone(); } @Override public Pad buildPad() { return new IPad(); } } // 生产一台小米手机 Phone miPhone = new MiFactory().buildPhone(); // 生产一台小米pad Pad pad = new MiFactory().buildPad(); // 生产一台苹果手机 Phone iphone = new AppleFactory().buildPhone(); // 生产一台ipad Pad ipad = new AppleFactory().buildPad();
其实上面这些抽象类,你改为接口也是可以的。
分类:
设计模式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix