4—工程师总结
创建型模式的主要关注点是“怎样创建对象?”
它的主要特点是“将对象的创建与使用分离”。
单例模式
在计算机系统中,还有 Windows 的回收站、操作系统中的文件系统、多线程中的线程池、显卡的驱动程序对象、打印机的后台处理服务、应用程序的日志对象、数据库的连接池、网站的计数器、Web 应用的配置对象、应用程序中的对话框、系统中的缓存等常常被设计成单例。
J2EE 标准中的 ServletContext 和 ServletContextConfig、Spring 框架应用中的 ApplicationContext、数据库中的连接池等也都是单例模式。
简单工厂–静态工厂模式
Animal a=new Dog();
Animal b=new Bird();
当前的背景:
- 如果每一次想要新生成一个不同的具体的动物,比如说你新生成一个小狗,一只鸟,那么每一次你都需要违反开闭原则(对扩展的开放对修改的关闭),也就是说,每一次想要新生成一个动物的时候,都要手动的去改,将之前那个一个小狗改成一只鸟,这就违反了开闭原则。
- 第二点是当前的这个动物类,他也已经违反了单一职责,因为它不仅仅是代表着动物封装的那些功能,他又承担了去实例化其他具体动物的功能。
优点:
- 将具体创造一个动物实例的代码修改为,只需要通过传递参数,就会创。造出具体的实例
- 而且当前的工厂类符合单一原则 他只负责创建对象 里面没有承担对象功能职责
- 满足创建型模式中所要求的“创建与使用相分离”的特点
缺点:
- 违反开闭原则 当新增加产品类型的时候 需要修改工厂接口
public class SimpleProdcutFactory {
/**
* 根据参数不同创建不同的产品 工厂模式又称静态工厂模式 记得写成static的
* @return
*/
public static FatherProduct create(String name){
if("1".equals(name)){
return new Product1();
}else if("2".equals(name)){
return new Prodcut2();
}
return null;
}
public static <T extends FatherProduct> T createByReact(Class<T> clazz){
FatherProduct product=null;
if(null!=clazz){
try {
product = (FatherProduct) Class.forName(clazz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
return (T) product;
}
}
工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。
工厂模式-将对象的创建和使用相分离
那就使用老套路接口封装工厂类 新增什么导致修改就写什么的子工厂类实现接口
将工厂模式
工厂模式 能力扩展的更好 仍然可以继续传递参数 比如size
到时候在工厂子类1 可以生产大的产品1 小的产品1
抽象工厂模式
工厂模式是一个工厂子类生产一个产品子类 二者一一对应
抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决。
类会很多 类的个数容易过多,增加复杂度
我们可以将粒度变小 一个函数生产一个产品子类
原因二:实际情况中 很多工厂都不只生产一种东西 所以将粒度控制到函数 是很好的 可以在一个工厂子类中生产多个产品
建造者模式
点击阅读文章
要实现链式方法调用,其实很简单,就是让每个set方法,返回自己即可,也很容易实现
Builder角色会有很多构建对象的方法,可以通过每个方法return this,
----java使用方法链set对象
原型模式
原型模式的克隆分为浅克隆和深克隆。
浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。
深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。
Java 中的 Object 类提供了浅克隆的 clone() 方法,具体原型类只要实现 Cloneable 接口就可实现对象的浅克隆,这里的 Cloneable 接口就是抽象原型类
浅克隆 只复制值 但是对象数组等这种在堆中有空间的都没有克隆 而是直接指向旧的对象的
—重点看深拷贝浅拷贝例子