NoTrouble's Blog

我们一路奋战,不是为了改变世界,而是为了不让世界改变我们


  • 首页

  • 标签

  • 分类

  • 歌单

  • 搜索

简单工厂(SimpleFactory)

发表于 2021-05-25 | 分类于 DesignPatterns

​ 在创建对象时不向客户暴露内部细节的暴露,并提供一个创建对象的通用接口。

​ 简单工厂就是把实例化的操作单独放在一个类中,这个类就成为简单工厂类,让简单工厂类来决定应该用哪个具体子类来实例化。

​ 简单工厂的好处是将客户类和具体的子类的实现解耦,客户类不再需要知道有哪些子类以及应当实例化哪个子类。客户类往往有多个,若不使用简单工厂,那么所有的客户类都要知道所有子类的细节。缺点是:再增加子类后,在简单工厂的方法中的逻辑都需要修改。

阅读全文 »

单例模式(Singleton)

发表于 2021-05-23 | 分类于 DesignPatterns

在运行时确保一个类只有一个实例,并提供该实例的全局访问点。

​ 在多种写法中需要考虑到以下几点:1.是否线程安全;2.是否懒加载;3.是否能通过反射,序列化破坏

阅读全文 »

阅读《On Java 8》-- 第十三章 函数式编程

发表于 2021-05-23 | 分类于 JAVASE

在计算机时代早期,内存是稀缺和昂贵。几乎每个人都用汇编语言。人们虽然知道编译器,但编译器生成的代码很低效,比手工编码的汇编程序多很多字节,仅仅想到这一点,人们还是选择汇编语言。

​ 通常,为了使程序能在有限的内存上运行,在程序运行时,程序员通过修改内存中的代码,使程序可以执行不同的操作,用这种方式来节省代码空间。这种技术被称为自修改代码(self-modifying code)只要程序小到几个人就能维护所有棘手和难懂的汇编代码,你就能让程序运行起来。

​ 随着内存和处理器变得更便宜、更快。C语言出现并被大多数汇编语言认为更“高级”。人们发现使用c可以显著提高生产力。同时,使用C创建自修改代码仍然不难。

​ 随着硬件越来越便宜,程序的规模和复杂性都在增长。这一切只是让程序工作变得困难。我们想方设法使代码更加一致和易懂。使用纯粹的自修改代码造成的结果就是:我们很难确定程序在做什么。它也难以测试:除非你想一点点测试输出,代码转换和修改等等过程?

​ 然而,使用代码以某种方式操作其他代码的想法也很有趣,只要能保证它更安全。从代码创建,维护和可靠性的角度来看,这个想法非常吸引人。我们不用从头开始编写大量代码,而是从易于理解、充分测试及可靠的现有小块开始,最后将它们组合在一起以创建新代码。难道这不会让我们更有效率,同时创造更健壮的代码吗?

​ 这就是函数式编程(FP)的意义所在。通过合并现有代码来生成新功能而不是从头开始编写所有内容,我们可以更快地获得更可靠的代码。至少在某些情况下,这套理论似乎很有用。在这一过程中,函数式语言已经产生了优雅的语法,这些语法对于非函数式语言也适用。

​ 你也可以这样想:OO(object oriented,面向对象)是抽象数据,FP(functional programming,函数式编程)是抽象行为。

​ 纯粹的函数式语言在安全性方面更进一步。它强加了额外的约束,即所有数据必须是不可变的:设置一次,永不改变。将值传递给函数,该函数然后生成新值但从不修改自身外部的任何东西(包括其参数或该函数范围之外的元素)。当强制执行此操作时,你知道任何错误都不是由所谓的副作用引起的,因为该函数仅创建并返回结果,而不是其他任何错误。

​ 更好的是,“不可变对象和无副作用”范式解决了并发编程中最基本和最棘手的问题之一(当程序的某些部分同时在多个处理器上运行时)。这是可变共享状态的问题,这意味着代码的不同部分(在不同的处理器上运行)可以尝试同时修改同一块内存(谁赢了?没人知道)。如果函数永远不会修改现有值但只生成新值,则不会对内存产生竞争,这是纯函数式语言的定义。因此,经常提出纯函数式语言作为并发编程的解决方案(还有其他可行的解决方案)。

​ 需要提醒大家的是,函数式语言背后有很多动机,这意味着描述它们可能会有些混淆。它通常取决于各种观点:为“并发编程”,“代码可靠性”和“代码创建和库复用”。关于函数式编程能高效创建更健壮的代码这一观点仍存在部分争议。虽然已有一些好的范例,但不足以证明纯函数式语言就是解决编程问题的最佳方法。

​ FP思想值得融入非FP语言,如Python。Java8也从中吸收并支持了FP。

阅读全文 »

阅读《On Java 8》-- 第十二章 集合

发表于 2021-05-18 | 分类于 JAVASE

通常,程序总是根据运行时才知道的某些条件去创建新的对象。在此之前,无法知道所需对象的数量甚至去确切类型。为了解决这个普遍的编程问题,需要在任意时刻和任意位置创建任意数量的对象。因此,不能依靠创建命名的引用来持有每一个对象:

1
MyType aReference;

​ 因为从来不会知道实际需要多少个这样的引用。

​ 大多数编程语言都提供了某种方法来解决这个基本问题。Java有多种方式保存对象(确切的说,是对象的引用)。例如前边曾经学习过的数组,它是编译期支持的类型。数组是保存一组对象的最有效的方式,如果想要保存一组基本类型数据,也推荐使用数组。但是数组具有固定的大小尺寸,而且在更一般的情况下,在写程序的时候并不知道你需要多少个对象,或者是否需要更复杂的方式来存储对象,因此数组尺寸固定这一限制就显得太过受限了。

​ java.util库提供了一套相当完整的集合类(collection classes)来解决这个问题,其中基本的类型有List、Set、Queue和Map。这些类型也被称作容器类(container classes),但我将使用Java类库使用的术语。集合提供了完善的方法来保存对象,可以使用这些工具来解决大量的问题。

​ 集合还有一些其它特性。例如,Set对于每个值都只保存一个对象,Map是一个关联数组,允许将某些对象与其他对象关联起来。Java集合类都可以自动地调整自己的大小。因此,与数组不同,在编程时,可以将任意数量的对象放置在集合中,而不用关心集合应该有多大。

阅读全文 »

Git的基本使用

发表于 2021-05-15 | 分类于 Git

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。

阅读全文 »

阅读《On Java 8》-- 第十一章 内部类

发表于 2021-05-14 | 分类于 JAVASE

一个定义在另一个类中的类,叫作内部类。

​ 内部类是一种非常有用的特性,因为它允许你把一些逻辑相关的类组织在一起,并控制位于内部的类的可见性。然而必须要了解,内部类与组合是完全不同的概念,这一点很重要。在最初,内部类看起来就像是一种代码隐藏机制:将类置于其他类的内部。但是,你将会了解到,内部类远不止如此,它了解外部类,并能与之通信,而且你用内部类写出的代码更加优雅而清晰,尽管并不总是这样(而且Java8的Lambda表达式和方法引用减少了编写内部类的需求)。

​ 最初,内部类可能看起来有些奇怪,而且要花些时间才能在设计中轻松地使用它们。对内部类的需求并非总是很明显的,但是在描述完内部类的基本语法与语义之后,就能明白使用内部类的好处了。

阅读全文 »

SpringMVC基本使用

发表于 2021-05-13 | 分类于 SpringMVC

SpringMVC概述

​ Spring为展现层提供的基于MVC设计理念的优秀的Web框架,是目前最主流的MVC框架之一。一种轻量级的、基于MVC的Web层应用框架。它能让我们对请求数据的出来,响应数据的处理,页面的跳转等等常见的Web操作变得更加简单方便。

阅读全文 »

阅读《On Java 8》-- 第十章 接口

发表于 2021-05-12 | 分类于 JAVASE

​ 接口和抽象类提供了一种将接口与实现分离的更加结构化的方法。

​ 这种机制在编程语言中不常见,例如C++只对这种概念有间接的支持。而在Java中存在这些关键字,说明这些思想很重要,Java为它们提供了直接支持。

​ 首先,我们将学习抽象类,一种介于普通类和接口之间的折衷手段。尽管你的第一想法是创建接口,但是对于构建具有属性和未实现方法的类来说,抽象类也是重要且必要的工具。你不可能总是使用纯粹的接口。

阅读全文 »

阅读《On Java 8》-- 第九章 多态

发表于 2021-05-11 | 分类于 JAVASE

​ 多态是面向对象编程语言中,继数据抽象和继承之外的第三个重要特性。

​ 多态提供了另一个维度的接口与实现分离,以解耦做什么和怎么做。多态不仅能改善代码的组织,提高代码的可读性,而且能创建有扩展性的程序——无论在最初创建项目还是在添加新特性时都可以“生长”的程序。

​ 封装通过合并特征和行为来创建新的数据类型。隐藏实现通过将细节私有化把接口与实现分离。这种类型的组织机制对于有面向过程编程背景的人来说,更容易理解。而多态是消除类型之间的耦合。在上一章中,继承允许把一个对象视为它本身的类型或它的基类类型。这样就能把很多派生自一个基类的类型当作同一类型处理,因而一段代码就可以无差别地运行在所有不同的类型上了。多态方法调用允许一种类型表现出与相似类型的区别,只要这些类型派生自一个基类。这种区别是当你通过基类调用时,由方法的不同行为表现出来的。

阅读全文 »

阅读《On-Java-8》-第八章-复用

发表于 2021-05-07 | 分类于 JAVASE

​ 如何在不污染代码的前提下使用现存代码是需要技巧的。在本章,将学习到两种方式来达到这个目的:

  • 第一种方式直接了当。在新类中创建现有类的对象。这种方式叫做“组合”(Composition),通过这种方式复用代码的功能,而非其形式。
  • 第二种方式更为微秒。创建现有类类型的新类。照字面理解:采用现有类形式,又无需在编码时改动其代码,这种方式就叫做“继承”(Inheritance),编译器会做大部分的工作。继承是面向对象编程(OOP)的重要基础之一。

阅读全文 »
<1…8910…13>

130 日志
31 分类
51 标签
GitHub E-Mail
© 2024 NoTrouble