简单工厂及二十三种设计模式(一),附代码详解

本文介绍了设计模式中的简单工厂、工厂方法、抽象工厂、单例模式以及建造者模式。从简单工厂模式的优缺点出发,探讨了如何通过工厂方法和抽象工厂模式提升代码的扩展性。接着,详细解释了单例模式的实现方式和线程安全问题。最后,讲解了建造者模式,它是如何一步步构建最终产品的,并强调了其在构建复杂对象时的优势。
摘要由CSDN通过智能技术生成

目录

一种简单工厂以及二十三种设计模式概要

简单工厂模式

定义

简单工厂的要素

创建型模式

工厂方法

定义

工厂方法的要素

抽象工厂

定义

抽象工厂的要素

单例模式

定义

饿汉式(背诵全代码)

懒汉式(背诵全代码)

线程安全考虑

建造者模式/生成器模式

定义

要素


在学习之初,可以先了解一下三个问题。
设计模式从何而来?设计模式是什么?设计模式分别解决的是什么问题?
学习路径可参考:史上最全设计模式导学目录(完整版)_LoveLion的博客-CSDN博客_设计模式目录

一种简单工厂以及二十三种设计模式概要

类型 模式 总数 备注
简单工厂模式 简单工厂模式 1
创建型模式 工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式 5 23种设计模式
结构型模式 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式 7
行为型模式 策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式 11

简单工厂模式

定义

所有创建对象的功能都在简单工厂这个类里完成,它包含大量的条件语句去构建实例对象。

简单工厂的要素

  • 抽象产品(Coffee):描述产品的主要特性和功能,抽象的表达表达产品。代码:定义一个接口,接口里的方法代表的是这个产品的主要特性和功能。备注:也可以是抽象类
  • 具体产品(Americano ,Latte):真正的产品,美式或者拿铁才是一个真正的具体的产品,而不是抽象的”咖啡“。代码:抽象产品是接口,具体产品就对应实现类。备注:抽象产品是抽象类,具体产品就对应其子类
  • 简单工厂类(SimpleFactory):提供了真正创建产品的方法。代码:根据方法输入的类型判断需要创建的具体对象是美式还是拿铁。

抽象产品(Coffee)

public interface Coffee {

    /**
     * 制作咖啡
     */
    void make();
}

 具体产品(Americano)  

public class Americano implements Coffee {
    public Americano() {
    }

    @Override
    public void make() {
        System.out.println("制作一杯美式咖啡");
    }
}

具体产品(Latte)   

public class Latte implements Coffee {

    public Latte() {
    }

    @Override
    public void make() {
        System.out.println("制作一杯拿铁咖啡");
    }
}

简单工厂

public class SimpleFactory {
    public static final String LATTE = "latte";
    public static final String AMERICANO = "americano";

    public Coffee createCoffee(String type) throws Exception {

        if (Objects.equals(type, LATTE)) {
            // 当type等于拿铁的时候,创建拿铁咖啡对象
            return new Latte();
        } else if (Objects.equals(type, AMERICANO)) {
            // 当type等于美式的时候,创建美式咖啡对象
            return new Americano();
        } else {
            throw new Exception();
        }
    }
}

 客户

public class Client {

    public static void main(String[] args) throws Exception {

        // 创建拿铁对象
        Coffee latte = new SimpleFactory().createCoffee("latte");
        // 调用拿铁对象的制作方法
        latte.make();

        // 创建美式对象
        Coffee americano = new SimpleFactory().createCoffee("americano");
        // 调用美式对象的制作方法
        americano.make();
    }
}

命令行输出

"C:\Program Files\Java\jdk1.8.0_341\bin\java.exe" ...
制作拿铁咖啡
制作美式咖啡

优点:用户可以从简单工厂里统一的方式获取自己想要的产品。

缺点:来一个新的类型咖啡品种比如FlatWhite,就需要在简单工厂的代码里加上多余的代码。

else if (Objects.equals(type, FLAT_WHITE)) {
    // 当type等于馥芮白的时候,创建馥芮白咖啡对象
    return new FlatWhite();
}

违反了开闭原则。那么有没有可扩展性更好的呢,在新加一种咖啡品种的基础上,不需要影响到原来的代码?升级请见下一章节。

创建型模式

工厂方法

定义

使用抽象类里的抽象方法来创建对象,由继承的子类来实例化具体的类。工厂方法将对象的实例化从简单工厂类推迟到了继承抽象类的子类。

工厂方法的要素

  • 抽象产品(Coffee):描述产品的主要特性和功能,抽象的表达表达产品。代码对应一个接口,接口里的方法代表的是这个产品的主要特性和功能。备注:也可以对应抽象类
  • 具体产品(Americano ,Latte):真正
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值