设计模式 创建型模式 创建者模式
概述1、定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示2、主要作用:在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。3、如何使用:用户只需要给出指定复杂对象的类型和内容,建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来)4、解决的问题:(1)、方便用户创建复杂的对象(不需要知道实现过程)(2)、代码复用性 & 封装性(将对象构建过程和细节进行封装 & 复用)5、注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序,一般用来创建更为复杂的对象
实现方式代码实现
抽象建造者(builder):描述具体建造者的公共接口,一般用来定义建造细节的方法,并不涉及具体的对象部件的创建。
具体建造者(ConcreteBuilder):描述具体建造者,并实现抽象建造者公共接口。
指挥者(Director):调用具体建造者来创建复杂对象(产品)的各个部分,并按照一定顺序(流程)来建造复杂对象。
产品(Product):描述一个由一系列部件组成较为复杂的对象。
12345678910111213141516 ...
设计模式 创建型模式 抽象方法模式
概述 抽象方法模式是工厂方法模式的一种扩展,最简单的抽象方法模式会退化成了工厂方法模式,抽象方法模式提出了产品族的一个概念。那么什么是产品族呢?还是以汽车为例,汽车是一个产品的抽象,汽车的型号就是汽车的产品族比如,suv,轿车,跑车。如果工厂模式创建的不是一个简单的产品,而是多个产品族的情况,那么就需要使用抽象方法模式
类图抽象方法模式需要以下几个角色
抽象工厂类
产品工厂类
抽象产品类
产品类
代码实现12345public abstract class AbstractCarFactory { abstract void buildSuv(); abstract void buildJiaoche(); abstract void buildYueYeChe(); }
public class BaoJunCarFactory extends AbstractCarFactory { private BaojunCar baojunCar=new BaojunCar(); @Override vo ...
设计模式 创建型模式 简单工厂模式
概述简单工厂模式又叫静态工厂模式,是属于创建型模式,工厂方法通过参数来控制创建不通的对象,这些对象都继承同一个夫类。
类图
代码实现12345678910111213public class CarFactory { public static Car getCar(String name) { if ("BMW".equals(name)) { return new BMWCar(); } if ("BAOJUN".equals(name)) { return new BaojunCar(); } throw new RuntimeException("unsupport car name "); }}
1234public interface Car { void desc();}
12345 ...
设计模式 七大设计原则
下面是我对7大设计原则自己的理解
单一原则一个类只做一件事情
里氏替换原则1.合理继承2.继承 子类是为了扩展父类,而不是重写相关方法。
依赖倒置原则高模块不应该直接依赖低模块,而是应该依赖其抽象
开闭原则对扩展开放,对修改关闭
迪莱米原则一个类引用类一个类,被引用类应该尽可能的封装自己的属性和方法,让别的类知道的越少越好
组合复合原则不推荐使用继承,可以使用组合的方式进行实现
接口隔离原则一个类对于另一个类的依赖,应该建立在最小的接口上,使用接口隔离
java 基础知识 动态代理 cglib代理
一、cglib代理介绍cglib代理是实现动态代理的另一种方式,CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接口或者为了更好的性能,CGLIB是一个好的选择
二、cglib的原理
动态生成目标类的代理类,重写代理类的所有非final修饰的方法,子类使用方法拦截的方式实现目标类的增强,所以cglib代理比jdk反射代理效率更高,并且能代理类,而jdk代理只能代理接口
底层使用asm字节码框架生成代理类,而不是使用反射生成类
缺点不能代理被final修饰的方法
三、cglib代理的实现public static void main(String[] args) {
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "resource");
Dog dog =new Dog();
Enhancer enhancer =ne ...
java 基础知识 动态代理 jdk代理
一、jdk动态代理动态代理分为jdk动态代理和cglib动态代理,本章讲解jdk动态代理
二、jdk动态代理如何实现
实现InvorcationHander接口,在invoke()方法实现增强
通过Proxy.newProxyInstance()方法获取到代理类
调用代理引用调用目标方法实现曾江
三、代码实现123456789101112public static void main(String[] args) { final Car car = new BmwCar(); Car carProxy = (Car) Proxy.newProxyInstance(Car.class.getClassLoader(), car.getClass().getInterfaces(), new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable ...
java 基础知识 静态代理
一、什么是代理模式
定义给目标对象提供一个代理对象,由代理对象操作目标对象的引用。
目的通过操作代理对象,操作目标对象,降低程序的复杂性,可以使用代理类实现目标对象的增强。不改变目标对象实现功能则增加。代理模式的结构图
1234graph LR;bwmcar-->car bwmcar-->bwmproxy bwmproxy-->car
二、java实现12345//定义一个接口public interface Car { public void run() ;}
123456//定义宝马车实现类public class BmwCar implements Car { public void run() { System.out.println("我是一个宝马车"); }}
123456789101112131415//定义宝马车实现类public class BmwCarProxy imple ...
java NIO 相关(七) nio selector channel 的多路复用器
一、概念选择器(selector)是selectableChannel对象的多路复用器,一个selector可以监控多个selectableChannel的io情况,selector可以实现一个线程单独管理多个channel,selector是非阻塞的核心
二、selector可以监控的事件类型
connect 客户端连接服务端事件
accept 服务端接受服务端事件
read 读事件
write 写事件
每次请求都是从客户端连接服务端(connect),服务端开始准备(accept),准备完成后开始读数据,处理完成之后再写数据
三、selector的常用方法
四、nio 的例子12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485//服务端public class NioServer & ...
java 基础知识 字符集
字符集相关概念编码: 字符串->字节数组
解码:字节数组->字符串
相关字符集介绍
ASCII (american standard code for information interchange 美国信息交换标准代码)7 bit 表示来表示一个字符,共计可以表示128中字符
Ios-8859-1 8 bit 表示一个字符 ,即使用一个字节 8 bit表示一个字符 共计可以表示 256个字符
Gb2312 2个字节表示一个汉字
Gbk 对 Gb2312的扩展 支持生僻字
Gb18030 表示汉字最多的
Big5 繁体中文
Unicode 最广泛的编码,两个字节表示一个字符 包含全球所有文字
缺点 : 存储空间会变大(英文国家)
Utf unicode是一个编码方式,而utf是一个存储方式 utf-8 是unicode的实现方式之一
Utf-16LE(小端) UTF16BE(大端)
文件起始位置 0xFEFF (BE) 0XFFFE(LE)
Utf-8 变长字节表示形式
一般来说,utf-8 会通过3个字节表示一 ...
java NIO 相关(六) pipe 和 FileChannel文件锁
一、pipe概念 pipe 是nio管道2个线程之前的单项数据连接。 pipe 有2个通道一个是source通道一个是sink通道数据会写入到source通道从sink通道获取数据。如图:
代码实现1234567891011121314151617181920212223242526272829303132333435363738394041424344public class PipeTest {public static void main(String[] args) { Pipe pipe = null; ExecutorService exec = Executors.newFixedThreadPool(2); try { pipe = Pipe.open(); final Pipe pipeTemp = pipe; exec.submit(new Callable<Object>() { @Override public Object call() throws Except ...