生成器设计模式
生成器(Builder)Intent封装一个对象的构造过程,并允许按步骤构造。
Class Diagram
Implementation以下是一个简易的 StringBuilder 实现,参考了 JDK 1.8 源码。
12345678910111213141516171819202122232425262728293031323334public class AbstractStringBuilder { protected char[] value; protected int count; public AbstractStringBuilder(int capacity) { count = 0; value = new char[capacity]; } public AbstractStringBuilder append(char c) { ensureCapacityInternal(count + 1); value[count++] = c; ...
简单工厂设计模式
简单工厂(Simple Factory)Intent在创建一个对象时不向客户暴露内部细节,并提供一个创建对象的通用接口。
Class Diagram简单工厂把实例化的操作单独放到一个类中,这个类就成为简单工厂类,让简单工厂类来决定应该用哪个具体子类来实例化。
这样做能把客户类和具体子类的实现解耦,客户类不再需要知道有哪些子类以及应当实例化哪个子类。客户类往往有多个,如果不使用简单工厂,那么所有的客户类都要知道所有子类的细节。而且一旦子类发生改变,例如增加子类,那么所有的客户类都要进行修改。
Implementation123public interface Product { void hello();}
123456public class ConcreteProduct implements Product { @Override public void hello() { System.out.println("Hello Java"); }}
123456 ...
责任链设计模式
责任链(Chain Of Responsibility)Intent使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链发送该请求,直到有一个对象处理它为止。
Class Diagram
Handler:定义处理请求的接口,并且实现后继链(successor)
Implementation123456789101112public abstract class Handler { protected Handler successor; public Handler(Handler successor) { this.successor = successor; } protected abstract void handleRequest(Request request);}
123456789101112131415161718public class ConcreteHandler1 extends Handler { publ ...
单例设计模式
单例(Singleton)Intent确保一个类只有一个实例,并提供该实例的全局访问点。
Class Diagram使用一个私有构造函数、一个私有静态变量以及一个公有静态函数来实现。
私有构造函数保证了不能通过构造函数来创建对象实例,只能通过公有静态函数返回唯一的私有静态变量。
ImplementationⅠ 懒汉式-线程不安全以下实现中,私有静态变量 uniqueInstance 被延迟实例化,这样做的好处是,如果没有用到该类,那么就不会实例化 uniqueInstance,从而节约资源。
这个实现在多线程环境下是不安全的,如果多个线程能够同时进入 if (uniqueInstance == null) ,并且此时 uniqueInstance 为 null,那么会有多个线程执行 uniqueInstance = new Singleton(); 语句,这将导致实例化多次 uniqueInstance。
1234567891011121314public class Singleton { private static Singleton uniqueInstanc ...
抽象工厂设计模式
抽象工厂(Abstract Factory)Intent提供一个接口,用于创建 相关的对象家族 。
Class Diagram抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并且这些对象是相关的,也就是说必须一起创建出来。而工厂方法模式只是用于创建一个对象,这和抽象工厂模式有很大不同。
抽象工厂模式用到了工厂方法模式来创建单一对象,AbstractFactory 中的 createProductA() 和 createProductB() 方法都是让子类来实现,这两个方法单独来看就是在创建一个对象,这符合工厂方法模式的定义。
至于创建对象的家族这一概念是在 Client 体现,Client 要通过 AbstractFactory 同时调用两个方法来创建出两个对象,在这里这两个对象就有很大的相关性,Client 需要同时创建出这两个对象。
从高层次来看,抽象工厂使用了组合,即 Cilent 组合了 AbstractFactory,而工厂方法模式使用了继承。
Implementation12345public class AbstractProductA { ...
如何优雅使用Docker
请收下这15个小技巧Tip 1获取最近运行容器的id 这是我们经常会用到的一个操作,按照官方示例,你可以这样做(环境ubuntu):
1234$ ID=$(docker run ubuntu echo hello world)hello world$ docker commit $ID helloworldfd08a884dc79
这种方式在编写脚本的时候很有用,比如你想在脚本中批量获取id,然后进一步操作。但是这种方式要求你必须给ID赋值,如果是直接敲命令,这样做就不太方便了。 这时,你可以换一种方式:
1234567$ alias dl=’docker ps -l -q’$ docker run ubuntu echo hello worldhello world$ dl1904cf045887$ docker commit `dl` helloworldfd08a884dc79
docker ps -l -q命令将返回最近运行的容器的id,通过设置别名(alias),dl命令就是获取最近容器的id。这样,就无需再输入冗长的docker ps - ...
单击鼠标所展示的浮动文字特效的js
单击鼠标所展示的浮动文字特效的js
1234567891011121314151617181920212223242526272829303132333435363738394041<script type="text/javascript">/*鼠标特效 */ /*这个方法用来随机一个十六进制颜色代码,让每一次点击浮动文字的杨色不同*/ function co(){ var colorElements = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f"; var colorArray = colorElements.split(","); var color ="#"; for(var i =0;i<6;i++){ color+=colorArray[Math.floor(Math.random() ...
Dubbo知识精华 下
1、了解Dubbo么?Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架,现已成为 Apache 基金会孵化项目。
官网:http://dubbo.apache.org
2、为什么要用Dubbo?因为是阿里开源项目,国内很多互联网公司都在用,已经经过很多线上考验。内部使用了 Netty、Zookeeper,保证了高性能高可用性。
使用 Dubbo 可以将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,可用于提高业务复用灵活扩展,使前端应用能更快速的响应多变的市场需求。
下面这张图可以很清楚的诠释,最重要的一点是,分布式架构可以承受更大规模的并发流量。
下面是 Dubbo 的服务治理图。
3、Dubbo 和 Spring Cloud 有什么区别?两个没关联,如果硬要说区别,有以下几点。
1)通信方式不同
Dubbo 使用的是 RPC 通信,而 Spring Cloud 使用的是 HTTP RESTFul 方式。
2)组成部分不同
4、dubbo都支持什么协议,推荐用哪种?dubbo://(推荐)
rmi://
hessian://
http://
...
Dubbo知识精华 上
1、默认使用的是什么通信框架,还有别的选择吗?默认也推荐使用netty框架,还有mina。
2、服务调用是阻塞的吗?默认是阻塞的,可以异步调用,没有返回值的可以这么做。
3、一般使用什么注册中心?还有别的选择吗?推荐使用zookeeper注册中心,还有redis等不推荐。
4、默认使用什么序列化框架,你知道的还有哪些?默认使用Hessian序列化,还有Duddo、FastJson、Java自带序列化。
5、服务提供者能实现失效踢出是什么原理?服务失效踢出基于zookeeper的临时节点原理。
6、服务上线怎么不影响旧版本?采用多版本开发,不影响旧版本。
7、如何解决服务调用链过长的问题?可以结合zipkin实现分布式服务追踪。
8、说说核心的配置有哪些?核心配置有
123456789101112131415dubbo:service/dubbo:reference/dubbo:protocol/dubbo:registry/dubbo:application/dubbo:provider/dubbo:consumer ...
ZooKeeper 概念
可能是全网把 ZooKeeper 概念讲的最清楚的一篇文章
前言相信大家对 ZooKeeper 应该不算陌生。但是你真的了解 ZooKeeper 是个什么东西吗?如果别人/面试官让你给他讲讲 ZooKeeper 是个什么东西,你能回答到什么地步呢?
我本人曾经使用过 ZooKeeper 作为 Dubbo 的注册中心,另外在搭建 solr 集群的时候,我使用到了 ZooKeeper 作为 solr 集群的管理工具。前几天,总结项目经验的时候,我突然问自己 ZooKeeper 到底是个什么东西?想了半天,脑海中只是简单的能浮现出几句话:“①Zookeeper 可以被用作注册中心。 ②Zookeeper 是 Hadoop 生态系统的一员;③构建 Zookeeper 集群的时候,使用的服务器最好是奇数台。” 可见,我对于 Zookeeper 的理解仅仅是停留在了表面。
所以,通过本文,希望带大家稍微详细的了解一下 ZooKeeper 。如果没有学过 ZooKeeper ,那么本文将会是你进入 ZooKeeper 大门的垫脚砖。如果你已经接触过 ZooKeeper ,那么本文将带你回顾一下 ...