基本定义
工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式让实例化推迟到子类。
模式结构
Product :抽象产品。所有的产品必须实现这个共同的接口,这样一来,使用这些产品的类既可以引用这个接口。
ConcreteProduct:具体产品。
Creator:抽象工厂。它实现了所有操纵产品的方法,但不实现工厂方法。Creator所有的子类都必须要实现factoryMethod()方法。
ConcreteCreator:具体工厂。制造产品的实际工厂。它负责创建一个或者多个具体产品。
模式实现:
Product 抽象产品类
ConcreteProduct 具体产品类
Factory 抽象工厂类
ConcreteFactory 具体工厂类
测试类
执行结果
09:46:41.447[main]INFOcom.yanyuan.gof.build.factory.v2.HuaweiPhone - 华为手机拨打貂蝉电话
09:46:41.463[main]INFOcom.yanyuan.gof.build.factory.v2.IPhone - iPhone手机拨打小乔电话
优缺点
优点
在工厂方法中,用户只需要知道所要的产品的具体工厂,无须关系具体的创建过程,甚至不需要具体产品类的名称。
在系统增加新产品时,我们只需要增加一个具体的产品类和实现工厂,无需对原工厂进行任何修改,很好的符合了“开闭原则”
缺点
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,系统中类的个数会成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖
总结
工厂方法模式完全符合“开闭原则”
工厂方法模式使用继承,将对象委托给子类,通过子类实现工厂方法来创建对象
在工厂方法模式中,创建者通常包含依赖于抽象的产品代码,而这些抽象产品是由子类创建的,创建者不需要知道制作哪种具体产品