三种工厂设计模式

三种工厂模式

我们平时说的工厂设计模式包含简单工厂工厂模式,工厂方法模式和抽象工厂模式。

总结就是如下:

  • 简单工厂:一个工厂类仅有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();

其实上面这些抽象类,你改为接口也是可以的。

posted @   沙里  阅读(365)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示