工厂方法设计模式——我的理解
简单点理解,就是为了将对象的创建与使用分离,并遵守对外开放对内封闭的原则,每个类 都有一个相应的 工厂对象,负责创建并初始化该类。
举例:
有许多手机制造商,如小米,华为,IPhone,三星等;客户只要手机产品,只知道产品名,而不关心手机的制造过程;客户不关心创建手机产品的细节,只关心产品的品牌和性能。
结构和图解
图解
结构
- 产品
组成(角色) | 关系 | 作用 |
---|---|---|
抽象产品(AbstractProduct) | 具体产品的父类 | 描述具体产品的公共接口 |
具体产品(ConcreteProduct) | 抽象产品的子类;工厂类创建的目标类 | 描述生产的具体产品 |
- 工厂
组成(角色) | 关系 | 作用 |
---|---|---|
抽象工厂(AbstractFactory) | 具体工厂的父类 | 描述具体工厂的公共接口 |
具体工厂(ConcreteFactory) | 抽象工厂的子类;被外界调用 | 描述具体工厂;实现FactoryMethod工厂方法创建产品的实例 |
外界通过调用不同具体工厂类的方法,从而创建不同具体产品类的实例
实例源码
下面我们使用手机生产来讲解该模式
- Phone类:手机标准规范类(AbstractProduct)
public interface Phone {
void make();
}
- MiniPhone类:制造小米手机(Product1)
public class MiniPhone implements Phone {
public MiniPhone() {
// 调用
this.make();
}
//
@Override
public void make() {
// 制造的具体过程
System.out.println("make xiaomi phone!");
}
}
- IPhone类:制造苹果手机(Product2)
public class IPhone implements Phone {
public IPhone() {
// 调用
this.make();
}
//
@Override
public void make() {
// 制造的具体过程
System.out.println("make iphone!");
}
}
- AbstractFactory类:生产不同产品的工厂的抽象类(*** AbstractFactory ***)
public interface AbstractFactory {
Phone makePhone();
}
- MiniFactory类:生产小米手机的工厂(ConcreteFactory1)
public class MiniFactory implements AbstractFactory{
// 创建
@Override
public Phone makePhone() {
return new MiniPhone();
}
}
- AppleFactory类:生产苹果手机的工厂(ConcreteFactory2)
public class AppleFactory implements AbstractFactory {
// 创建
@Override
public Phone makePhone() {
return new IPhone();
}
}
- 演示
public class Demo {
public static void main(String[] arg) {
AbstractFactory miniFactory = new MiniFactory();
AbstractFactory appleFactory = new AppleFactory();
miniFactory.makePhone(); // make xiaomi phone!
appleFactory.makePhone(); // make iphone!
}
}
优缺点
优点
- 更符合开-闭原则
新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可
- 符合单一职责原则
每个具体工厂类只负责创建对应的产品
- 不使用静态工厂方法,可以形成基于继承的等级结构
缺点
- 一个具体工厂只能创建一种具体产品
- 添加新产品时,除了增加新产品类外,还要提供与之对应的具体工厂类,系统类的个数将成对增加,在一定程度上增加了系统的复杂度;同时,有更多的类需要编译和运行,会给系统带来一些额外的开销。
- 虽然保证了工厂方法内的对修改关闭,但对于使用工厂方法的类,如果要更换另外一种产品,仍然需要修改实例化的具体工厂类。
在Spring中的应用场景
控制反转
通常由应用程序直接使用 new 创建新的对象,为了将对象的创建和使用相分离,采用工厂方法模式方法,即应用程序将对象的创建及初始化职责交给工厂对象
想了解更多,快来关注吧
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/69802.html