版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)
定义与类型
定义:定义一个创建对象的接口
但让实现这个接口的类来决定实例化哪个类
工厂方法让类的实例化推迟到子类中进行
类型为创建型
适用场景
创建对象需要大量重复的代码
客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
一个类通过其子类来指定创建哪个对象
优点
用户只需要关心所需产品对应的工厂,无须关心创建细节
加入新产品符合开闭原则,提高可扩展性
使用的软件设计原则:里氏替换原则 开闭原则
运用了面向对象的多态
缺点
类的个数容易过多
扫描二维码关注公众号,回复:
6787786 查看本文章
增加复杂度增加了系统的抽象性和理解难度
演示
创建一个Cake的抽象类
package softwareDesign.coding.factoryMethod;
public abstract class Cake {
public abstract void produce();
}
巧克力蛋糕
package softwareDesign.coding.factoryMethod;
public class CCake extends Cake{
@Override
public void produce() {
System.out.println("生产巧克力蛋糕");
}
}
雪花蛋糕
package softwareDesign.coding.factoryMethod;
public class SnowCake extends Cake{
@Override
public void produce() {
System.out.println("生产雪花蛋糕");
}
}
创建一个工厂的抽象类
package softwareDesign.coding.factoryMethod;
public abstract class CakeFactory {
public abstract Cake getCakeFactory();
}
创建巧克力蛋糕工厂
package softwareDesign.coding.factoryMethod;
public class CCakeFactory extends CakeFactory{
@Override
public Cake getCakeFactory() {
return new CCake();
}
}
创建雪花蛋糕生产工厂
package softwareDesign.coding.factoryMethod;
public class SnowCakeFactory extends CakeFactory {
@Override
public Cake getCakeFactory() {
return new SnowCake();
}
}
测试:
package softwareDesign.coding.factoryMethod;
public class Test {
public static void main(String[] args) {
CakeFactory cakeFactory = new CCakeFactory();
Cake cake = cakeFactory.getCakeFactory();
cake.produce();
CakeFactory cakeFactory2 = new SnowCakeFactory();
Cake cake2 = cakeFactory2.getCakeFactory();
cake2.produce();
}
}
结合着 简单工厂去理解
我们看一下UML图
如果进行拓展的话,加入新的蛋糕类型和工厂 都只是“在外层补补”,不会触及核心代码。 很容易看出 工厂方法很巧妙地解决了产品组的问题