创建型模式--设计模式详解?

简介: 创建型模式--设计模式详解?

设计模式 的创建型模式 工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。


创建型模式


简单工厂模式:

public class SimplePizzaFactory {
    public Pizza createPizza(String pizzaType){
        Pizza pizza = null;
        if(pizzaType.equals("greek")){
            pizza = new GreekPizza();
            return pizza;
        }
        if(pizzaType.equals("cheese")){
            pizza = new CheesePizza();
            return pizza;
        }
        return null;
    }
}

这样写可以看到一个问题:简单的工厂模式创建类依赖于工程类,如果想要扩展,则必须对工厂类进行修改,违背了开闭原则,所以从设计角度来说,如何解决这个问题?可以定义一个抽象类,并且通过不同的工厂类实现该接口。

public class LDOrderPizza  extends AllPizza {
    @Override
    public Pizza createPizza(String pizzaType) {
        Pizza pizza = null;
        if(pizzaType.equals("greek")){
            pizza = new GreekPizza();
            return pizza;
        }
        if(pizzaType.equals("cheese")){
            pizza = new CheesePizza();
            return pizza;
        }
        return null;
    }
}
public class CNOrderPizza extends AllPizza {
    @Override
    public Pizza createPizza(String pizzaType) {
        Pizza pizza = null;
        if(pizzaType.equals("greek")){
            pizza = new GreekPizza();
            return pizza;
        }
        if(pizzaType.equals("cheese")){
            pizza = new CheesePizza();
            return pizza;
        }
        return null;
    }
}

这样写的好处是什么呢,你现在想实现一个功能,只需要实现一个类就ok了,无需改变已有的代码,扩展性更好。


工厂方法存在的问题则是用户需要取LD工厂订披萨,就必须去LD,想去CN则必须去CN工厂。为了解决这个问题,我们把工厂类抽象为接口。

public class LDOrderPizza  extends AllPizza {
    public LDOrderPizza(String address) {
        super(address);
    }
    @Override
    public Pizza createPizza(String pizzaType) {
        Pizza pizza = null;
        if(pizzaType.equals("greek")){
            pizza = new GreekPizza();
            return pizza;
        }
        if(pizzaType.equals("cheese")){
            pizza = new CheesePizza();
            return pizza;
        }
        return null;
    }
}
public interface AbsFactory {
    Pizza createPizza(String pizzaType) ;
}

这样写的好处不需要根据不同的工厂继续创建对应的工厂类,只需要传递指定的工厂名称即可。


适用的场景:大量的产品需要创建,并且有共同的接口。


普通工厂模式:只支持扩展产品。


其中抽象工厂模式,用来生产不同工厂的产品,支持扩展性产品,支持增加产品种类工厂。


单例模式:

分为懒加载和预加载。

懒加载:在使用对象的时候才会加载对象。

预加载:还没是使用的时候就已经创建好放入内存。

很明显,预加载只有一条return语句,线程是安全的的,但是缺点是性能的浪费,但是懒加载在两个线程同时访问的时候,有机会发生线程不安全问题。

public class LanSingleton {
    private static volatile Singleton singleton = null;
    private LanSingleton() {
    }
    private static synchronized Singleton getInstance() {
        if(singleton == null){
            synchronized (Singleton.class){
                if(singleton == null){
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}
class Singleton {
}

上面加了双重效验以及volatile,为了防止创建不同的对象,volatile为了保证可见性,因为两个线程访问的时候,会导致重排序发生。


生成器模式:

封装一个复杂对象构造过程,并允许按步奏构造。


优点就是可以将一个对象分解为各个组件,将组件封装起来,控制整个对象的生成过程。


缺点不同类型的对象要实现不同具体构造器的类,大大增加了类的数量。


与工厂模式不同的是,会按多个步奏来构造对象额,而工厂模式只有一个步奏。


原型模式:

通过复制现有实例来创建新的实例,无需知道相对应类的信息。


原型模式的本质就是clone,可以解决构造复杂对象资源问题,某些场景提升构建对象效率。还提供保护性拷贝,可以通过返回一个拷贝对象的形式,实现只读的限制。

相关文章
|
13天前
|
人工智能 自然语言处理 文字识别
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
Qwen3.7-Max是阿里云百炼面向智能体时代推出的新一代旗舰模型,对标GPT-5.5、Claude Opus 4.7等闭源旗舰。该模型支持百万级token上下文窗口,具备顶级推理能力、多模态搜索与视觉理解增强、流式输出低延迟响应等核心优势,覆盖编程、办公、长周期自主执行等复杂场景。同时支持OpenAI接口兼容,便于系统快速迁移。用户可通过Token Plan团队或节省计划等订阅方式灵活调用,适合企业级高要求场景使用。
5251 28
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
|
8天前
|
存储 定位技术 数据库
CodeGraph 如何让 Claude Code减少 7 成工具调用?
CodeGraph 为 Coding Agent 提供本地代码知识图谱,把函数、类、调用链和框架路由提前整理成“项目地图”,减少盲目搜索和文件读取。它不是新 Agent,而是上下文基础设施,让 Agent 更快找到正确代码路径,平均减少 7 成工具调用。
1038 0
|
15天前
|
人工智能 自然语言处理 供应链
|
5天前
|
人工智能 安全 定位技术
CodeGraph深度解析 让Claude Code工具调用直降七成的核心原理与实操教程
如今以Claude Code为代表的AI编程智能体已经成为开发者日常编码、项目重构、漏洞修复的必备工具。但在长期使用过程中,几乎所有开发者都会遇到同一个明显痛点:AI虽然具备强大的代码生成与分析能力,却常常陷入盲目探索的循环中。
716 1
|
21天前
|
人工智能 开发工具 iOS开发
Claude Code 新手完全上手指南:安装、国产模型配置与常用命令全解
Claude Code 是一款运行在终端环境中的 AI 编程助手,能够直接在命令行中完成代码生成、项目分析、文件修改、命令执行、Git 管理等开发全流程工作。它最大的特点是**任务驱动、终端原生、轻量高效、多模型兼容**,无需图形界面、不依赖 IDE 插件,能够深度融入开发者日常工作流。
3777 15
|
17天前
|
人工智能 Linux BI
国内用 Claude Code 终于不用翻墙了:一行命令搞定,自动接 DeepSeek
JeecgBoot AI专题研究 一键脚本:Claude Code + JeecgBoot Skills + DeepSeek 全平台接入 一行命令装好 Claude Code + JeecgBoot Skills + DeepSeek 接入,无需翻墙使用 Claude Code,支持 Wind
3442 10
国内用 Claude Code 终于不用翻墙了:一行命令搞定,自动接 DeepSeek

热门文章

最新文章