Java设计模式之工厂模式

设计模式之工厂模式

现在是对工厂模式的学习,之前的部分有对简单工厂的学习,如果对简单工厂模式不太了解的话可以回过去熟悉一下,下面进入正文的学习

一 : 含义 什么是工厂模式 ?

    工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。

二 : 解决的问题

         工厂一旦需要生产新产品就需要修改工厂类的方法逻辑,违背了“开放 - 关闭原则 (简单工厂模式的缺点)

三: 模式原理

3.1模式的结构

工厂方法模式的主要角色如下。

  1. 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
  2. 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
  3. 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
  4. 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

3.2模式类图
在这里插入图片描述
3.3 优缺点

优点:

  1. 更符合开-闭原则新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可
  2. 符合单一职责原则,灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
  3. 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。
    总结:工厂模式可以说是简单工厂模式的进一步抽象和拓展,在保留了简单工厂的封装优点的同时,让扩展变得简单,让继承变得可行,增加了多态性的体现。

缺点:

  1. 类的个数容易过多,
  2. 增加复杂度 增加了系统的抽象性和理解难度
  3. 抽象产品只能生产一种产品此弊端可使用抽象工厂模式解决。

四 实现代码

步骤一 : 创建抽象产品

 * @Description 抽象产品 : 玩具
 * @createTime 2021年05月14日 15:30:00
 */
public interface Toy {
    /**
     * 抽象方法 : 获取玩具
     */
    void getProduct();
}

步骤二 : 创建抽象工厂

 * @Description 抽象工厂 : 提供了创建产品的接口
 * @createTime 2021年05月14日 15:32:00
 */
public interface ProductFactory {
    /**
     * 调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
     * @return 具体产品
     */
    Toy makeProduct();
}

步骤三 : 创建具体产品

 * @Description 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,
 * 由具体工厂来创建,它同具体工厂之间一一对应。
 * @createTime 2021年05月14日 15:34:00
 */
public class ToyList {
    static class ToyDog implements Toy{
        @Override
        public void getProduct() {
            System.out.println("一个玩具狗");
        }
    }

    static class ToyCat implements Toy{
        @Override
        public void getProduct() {
            System.out.println("一个玩具喵");
        }
    }
}

步骤四 : 创建具体工厂

 * @Description 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
 * @createTime 2021年05月14日 15:37:00
 */
public class FactoryList {
    static class DogToyFactory implements ProductFactory{
        @Override
        public Toy makeProduct() {
            return new ToyList.ToyDog();
        }
    }

    static class CatToyFactory implements ProductFactory{
        @Override
        public Toy makeProduct() {
            return new ToyList.ToyCat();
        }
    }
}

步骤五 测试

 public static void main(String[] args) {
        //客户想要一个玩具猫
        FactoryList.DogToyFactory dogToyFactory = new FactoryList.DogToyFactory();
        dogToyFactory.makeProduct().getProduct();

        //客户想要一个玩具狗
        FactoryList.CatToyFactory catToyFactory = new FactoryList.CatToyFactory();
        catToyFactory.makeProduct().getProduct();
    }

在这里插入图片描述

五 总结 :

应用场景 :

  1. 客户只知道创建产品的工厂名,而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等。
  2. 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
  3. 客户不关心创建产品的细节,只关心产品的品牌

        对工厂模式的学习就记录这么多,如果对大家有帮助的话,可以点一个赞哈,你的鼓励也是创作的动力.共同在计算机的世界加油吧 !

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值