【Java设计模式】工厂方法

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (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图
在这里插入图片描述
在这里插入图片描述

如果进行拓展的话,加入新的蛋糕类型和工厂 都只是“在外层补补”,不会触及核心代码。 很容易看出 工厂方法很巧妙地解决了产品组的问题

猜你喜欢

转载自blog.csdn.net/qq_42322103/article/details/94898920