李浩

李浩

设计模式

设计模式之工厂模式

工厂方法模式定义了创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。 来解析这个定义: 1. “创建对象”这个点非常关键,表明了工厂模式的职责就是为了创建对象的,而不是干其他委托、代理什么的。同时也将创建对象这个职责从Client迁移出去了。 2. “子类决定要实例化的类是哪一个”,说明创建对象的方法被子类继承,而这个方法的返回值是目标类,并且隐含着一个更重要的点,父类中定义的这个方法的返回值一定是一个目标抽象类,而子类返回是目标具体类。 3. “实例化推迟到子类”,表明是在客户端调用时,通过选用不同的子类,来决定目标对象的具体类。 学习设计模式,一个关键的自我校验,是能够自己给自己出题,构建场景,并通过目标设计模式来解决。 💡假设我们有一个汽车制造系统,系统需要生产不同类型的汽车(如电动车、燃油车)。我们可以使用工厂方法模式来实现这个系统,使得不同类型的汽车由不同的工厂子类来创建。 // 1. 定义抽象产品类(汽车) abstract class Car { public abstract void drive(); } /

By 李浩

设计模式

设计模式之装饰者模式

装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的方案。 来解析这个定义: 1. “动态”指的在运行时进行的,而不是在编译时,也即客户端调用时可以临时决定增加责任到对象上。 2. “责任附加”意味着可以在不修改原有对象的情况下,增加新的行为或功能。 3. “比继承更有弹性”,说明使用的是组合而不是继承,通过组合可以在运行时动态地添加或移除功能。弹性意味可以组合多个能力,而不需要创建大量子类。 装饰者最重要的核心是装饰者和被装饰者来自于同一个超类。相比较于策略模式、观察者模式,难以理解一点,并不是一个自然就能想到的结构。我们从源头来看看它的设计脉络。 💡假设我们正在开发一个文档编辑器,用户可以在编辑器中输入文本,并对文本应用各种格式(如加粗、斜体、下划线等)。编辑器需要支持以下功能:用户可以动态地为文本添加或移除格式,格式可以叠加(例如,文本可以同时加粗和斜体)。 先来一个自然能想到的简单实现: // Text 类 public class PlainText { private String content;

By 李浩

设计模式

设计模式之观察者模式

观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到并自动更新。 来解析这个定义: 1. “一对多依赖”说明被观察的主题需要维护一个观察者列表,当然要提供加入列表和从列表删除的能力,可以命名为attach、detach方法,来实现观察者的添加和移除。 2. “对象改变状态”说明了被观察者有一个被关注的参数属性。 3. “一个对象改变状态时,它的所有依赖者都会收到并自动更新”说明当主题发生变化时,依赖者有一个方法可以被触发执行更新操作,所谓“自动”指依赖者不必要主动调用,而是被动调用,因此依赖者需要有一个被调用的方法,可以命名为update。 4. 结合关联抽象的经验,所有依赖者应该有一个共同的抽象,给到主题维护 可以初步得到以下类图。 学习设计模式,一个关键的自我校验,是能够自己给自己出题,构建场景,并通过目标设计模式来解决。 💡新闻订阅(RSS 订阅)是一个日常生活中经常碰到的场景,这个场景中新闻发布者(NewsPublisher) 是被观察者(Subject),而 订阅者(Subscriber) 是观察者(Observer

By 李浩

设计模式

设计模式之策略模式

策略模式定义了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。 来解析这个定义,“算法簇”&“相互替换”代表了是一组相同目的算法,肯定是利用多态能力实现。脑海中,下述的类图就出来了。 “变化独立于使用算法的客户”,这句话的意思是,使用这些算法的客户端代码不需要因为算法的变化而修改自身,什么意思,如何能做到改变算法而不修改自身,那就是客户端代码只依赖于算法的抽象(接口),而不是具体的实现。 通过类图,可以清晰的看到两者的区别。 学习设计模式,一个关键的自我校验,是能够自己给自己出题,构建场景,并通过目标设计模式来解决。 💡以支付场景来举例,具体的支付方式有支付宝和微信,需要支持用户在实际付款时动态切换。 1. 定义算法接口:定义一个 PaymentStrategy 接口,表示支付方式的抽象。 public interface PaymentStrategy { void pay(int amount); } 2. 实现具体算法:AlipayStrategy 和 WechatPayStrategy 分别实现 Payment

By 李浩

设计模式

设计模式开篇

首先应该对要讨论的设计模式主题进行约束,是面向对象编程的设计模式,针对于非面向对象编程,如函数式编程、过程式编程,也有相应的设计模式。 明确了是面向对象编程,那么所有的设计套路都是基于面向对象编程的特性,封装、抽象、继承、多态四大特性就是设计模式的基础,各种模式都是利用了这些基础能力来巧妙设计的,如果没有编程语言自身的能力支持,就谈不上设计模式了。 因此,这四大特性应该真正做到理解,而非死记硬背,理解之后,后续讲到每一种设计思路时,才会有清晰的脉络,模式不是被突发的设计出来的,而是经过经验演进而来。 封装,将同一类的属性、方法统一装在一个类中,强调聚类效果。 抽象,在具体类别上再设计一层,能够更高的抽象,定义通用的接口或抽象类,隐藏具体的实现细节,提供更通用的视图。 继承,通过类的层次化结构实现代码复用,子类可以扩展或修改父类的行为,减少代码重复。 多态,通过父类的接口调用子类的具体实现,使得代码能够以一种通用的方式处理不同的对象,提高代码的通用性和灵活性。 这些特性共同构成了面向对象编程的核心,是设计模式的基石。 上图中,可以看到是整个设计模式的一个最小结构,其他的模式都是

By 李浩

认知客厅

事以密成语以泄败

大家常常会在励志短视频中看到这样一句话,在事情做成之前对谁都不要说,包括最亲密的人。而与这句话相同意思的警句就是“事以密成语以泄败”。 这句话出自《韩非子》的《说难》篇,更多的侧重于政治及军事上,对信息保密的重要信,信息的泄漏可能会导致计划失败甚至灾祸。 对于现代社会的年轻人来说,更多的用于表达内心的某项个人成长计划、事业规划,比如在年初立下今年flag,热血上头要三个月掌握某项技能等,而非政治或军事上的含义。 那为什么会说在立个人计划时,也最好遵循此条行事准则呢。初一听会觉得挺有道理,做事情需要沉稳,提早说出来的人一般城府不足,定力不够,在成事概率上会降低许多。再者,话提早说出来就像煮饭提前揭锅,导致饭不熟,这是一个很容易理解的联想。 但这些解释还是在科学性上不够令人信服,大多是经验层面的总结,城府、定力、联想均是,这样就容易让人半信半疑,半信半疑就是不信,对某一认知,不是嘴上说出来就是掌握了,最终必须是通过行为实践上来体现。 知行合一,从“知”到“行”,其实中间还有一个十分关键的点,就是“信”,是发自内心的相信,半信半疑不行,

By 李浩

AI 小径

利用神经网络拟合一元二次方程

我们这次要拟合的关系是一个一元二次方程 目标 * 理解参数初始化对于模型效果的重要影响。 * 学习模型训练过程中,如何通过观察损失值相应的调整学习率、epoch大小。 数据构建 这次我们在准备数据的时候,就将数据进行划分好,总训练集100个,训练集90个,测试集10个。 # 生成准备y = x^2 + 2x + 1数据,共100个点,并按9:1的比例划分为训练集和测试集,并保存到CSV文件 ​ import numpy as np ​ from sklearn.model_selection import train_test_split ​ # 生成输入数据 x = np.linspace(-10, 10, 100) # 在[-10, 10]范围内生成100个均匀分布的点 ​ # 生成目标输出数据 y = x**2 + 2 * x

By 李浩

AI 小径

利用神经网络拟合一元线性方程

在现代人工智能技术中,神经网络通常被应用于复杂的非线性问题,如图像分类、语音识别和自然语言处理。然而,即便是简单的数学关系,像一元线性方程(y = ax + b) 的拟合,对于理解神经网络的基本原理、训练过程及其局限性会是很好的学习案例。 本文将探索如何利用神经网络来拟合这样一个简单的线性方程。我们将从零开始搭建一个基础网络,通过逐步训练,观察网络如何学习到输入与输出之间的线性关系。通过这个简单的示例,我们不仅可以验证神经网络的学习能力,还可以揭示一些训练过程中的常见挑战和优化技巧。 选择拟合的目标方程是: 目标 * 对可视化探索、模型构建、模型训练、模型测试有一个全程直观了解。 * 观察学习率、epoch调整对结果训练结果带来的影响。 数据构建 先来手动制作一批训练数据,以便为神经网络提供可用于拟合的样本数据。可以快速编写一个小脚本,生成 100 对 (x, y) 数据点,并将其保存在 train.csv 文件中。我们选择了一元线性方程 y = ax + b 的形式,后续构建神经网络及训练的目标是,通过训练逐步学习到系数 a

By 李浩

随笔小亭

企业挣钱跟小区店铺有类似逻辑

今天在填明年海外部门预算,以往都是敷衍了事,没有在意,这次专门看了具体条目,以及金额数量,才发现预算金额如此庞大,再加上idc成本,人员成本,场地费,税务,剩下的就没多少来。一直以为挣了好多好多,结果算上来净利润还是在百分之三十左右,虽然说对比其他行业来说,已经是一个非常不错的水平了,但对于之前没有详细算过账的感觉来说,一下就打破模糊的偏差认知了。 这个利润率,也是公司坚持投入了好多年,才逐步打平以至营收的。 具体办企业与小商店在底层逻辑上有哪些共同点呢。 一,最后的利润,都是钱经过层层漏斗,漏到最后能留下来的,才是最后到口袋的。哪一个环节没有做好控制,都容易入不敷出。每个环节的成本控制,都不可忽视。对于负责人或老板来说,对每个环节的成本支出必须做到了然于胸。 二,外部合作必不可少,不管是企业还是小商店,都只是经济环节中的某一环,都会有上下游合作方,对于软件公司来说,云平台、支付渠道、投流平台等都会涉及到与其他企业的利益分配。对于小商店来说,进货商、场地租金、营收工具等都需要花钱解决,商店本身只负责末端售卖。大家都是整条产业链中的一环,参与进来才是最重要的。 三,都会有成本,

By 李浩

随笔小亭

好的故事创意是否不会枯竭

似乎好久没有看到十分精彩的电影了,新出的电影观影过程中几乎就能才到后续的发展,总会感觉似曾相识或过于老套,引发了一个思考 - 好的故事创意是否不会枯竭。 如果不会枯竭,说明创意是一个永不会灌满的大水池,想不出创意只是能力问题,创意的点还无穷无尽。如何论证呢,无法论证,但是能计算,何解? 创意也可以分解为创意点的组合,将人类有史以来所有的故事放在一起,进行分解,可以提取出不同维度的要点,并且每个要点都会是可枚举的,即便是还未被创作出来的,其要点数量也会是可枚举的,可枚举的要点排列组合在一起,就会是一个有限数量大小。 如此看来,整个池子是一个固定数量,前面的创意点相对容易挖掘,越到后面,越难挖掘出来,想必这就是电影越来越难以创新的原因了,已挖掘的创意点多了,后续创意需要避开现有点才能被称为创意。 站在人的维度,看的电影越多,后续能触动到你的点就越少了。

By 李浩

随笔小亭

是什么在支撑这个民族

经常在一些局上,听公司上位者侃侃而谈,他们在社会发展的浪潮中,随着企业上市,成功的实现财富自由,应该来说,会对国家、社会、民族会心存感激,但从他们的话语中,鲜有如此论调,更多的是冷嘲热讽,谈话内容多是滑雪、潜水、旅游、大餐、出入境携款、移民等话题,对于国家经济、政策、环境,鲜有积极话语,更别说感激之类,这些多少令我有些差异。 他们对国内信息,多半是不信,而是从自认为更客观的外媒中去获取。发出的声音也多半对国内抨击的。 给我一种强烈的感觉,一群精致的利己主义精英。 改革开放四十多年,整个社会价值观都被绑在以金钱唯一锚定物的评价体系中,所有人一致的向钱看,没钱的自惭形秽,物质生活不如人,谈家国、谈情怀、谈文化会缺少底气,有钱的更关心如何赚更多钱。 成长的过程中,都会被教得圆滑、世故,有错吗,也并不是,做事情避免不了与人打交道,就需要尽可能团结一切能团结的人,避免树敌,在不违背大原则的前提下,圆滑世故换个角度来看,也是照顾对方的感情,

By 李浩

雷军在参访中多次提到他是一个极度专注的人

花了几个小时雷总在小米汽车发布之后接受的访谈,在谈话过程中,他多次说到自己不是一个投机者,而是一个坚定的长期主义者,做事情十分认真,极度专注。 聊到了小米决定开始做汽车时,董事会只提了一个要求,雷军必须亲自带队,而不能是找一个代理人来干,这是投资人对他无比的信任,事实证明,他们的判断是正确的。人,才是最重要的。 在访谈中有很多点令我印象深刻。 一,他说他是一个做事很认真,极度专注的人。认真、极度专注,在做事的过程中,会产生心流,产生的内啡肽是一种更高级的满足感,懂得了很多道理,只是第一步,这一步很重要,驱散心魔,让自己不会被后悔、内耗、焦虑、嫉妒等情绪裹挟,精力不被内耗,只把精力投入到事情本身,这是认知提升的过程,是修炼的过程,是“知”的阶段。下面就需要去“行”,这才是更重要的一步,可以半知而行成功的,但绝不能知而半行而成功的。去做事,去极致专注的做事。 二,要做对的事情,“站在风口上,猪都可以飞起来”

By 李浩