作业二:读书笔记----软件设计原则、设计模式
这个作业属于哪个课程 | 2022软件代码开发技术 |
---|---|
这个作业要求在哪里 | 读书笔记----软件设计原则、设计模式 |
这个作业的目标 | 1. 结合一些图、表工具,对设计模式相关书籍的主要内容进行归纳总结。 2. 设计模式的示范 |
这个作业属于哪个课程 | 2022软件代码开发技术 |
一、设计原则
Bob大叔总结:五个基本原则
单一职责
开闭原则
软件中的对象应该对于扩展是开放的,对于修改是封闭的:重要手段:抽象,接口支持泛型可以使程序更容易扩展
里氏替换原则
LSP原则 只要父类能出现的地方,子类可以进行替换而不出错
依赖倒置原则
DIP Dependence Inversion Principle解耦
高层模块不应该依赖低层模块,两者都应该依赖其抽象
抽象不应该依赖细节
细节应该依赖抽象
接口隔离原则
ISP InterfaceSegregation Principles客户端不应该依赖它不需要的接口
另:
迪米乐原则
类负责的事情要明确,解耦,应该只需要关心最少的东西
二、常用设计模式
常用的包括:单例模式、Builder模式、原型模式、工厂模式、抽象工程模式、策略模式、状态模式、责任链模式、解释器模式、命令模式
框架模式:MVC、MVP、MVVM
部分的简单介绍:
单例模式
Java实现版本
//方式一 饿汉式:提前生成
class Singleton{
private static Singleton singleton=new Singleton();
private Singleton(){}
public static Singleton getInstrance(){
return singleton;
}
}
public class Test{
public static void main(String[] args){
Singleton singleton=Singleton.getInstrance();
}
}
//方式二 懒汉式:用的时候再创建
class Singleton{
private static Singleton singleton;
private Singleton(){}
public static Singleton getInstrance(){
if(singleton==null){
singleton=new Singleton;
}
return singleton;
}
}
public class Test{
public static void main(String[] args){
Singleton singleton=Singleton.getInstrance();
}
}
//方式三 线程安全的懒汉式:volatile保证内存可见性,DCL双重检查锁定
class Singleton{
private static volatile Singleton singleton;
private Singleton(){}
public static Singleton getInstrance(){
if(singleton == null){
synchronized(Singleton.class){
if(singleton == null{
singleton=new Singleton;
}
}
}
return singleton;
}
}
public class Test{
public static void main(String[] args){
Singleton singleton=Singleton.getInstrance();
}
}
//方式四 巧妙运用jdk的线程安全单例模式:利用枚举类
//使用:EnumSingleton.INSTANCE.method();
public enum EnumSingleton {
INSTANCE;
public method(){}
}
Builder模式
常用来进行链式的进行配置(return builder;)
原型模式
主要是通过克隆的方式完成
浅拷贝(影子拷贝)、深拷贝
对于会拷贝引用对象的都需要对他们进行clone才能成深拷贝
三、总结与反思
对于常用的设计模式在编写代码中经常有用到,但是对于其他的设计模式很不熟悉。对于单例模式,最后通过jdk妙用的方式可以很方便的使用。
在单例模式中,几乎每个项目都会用到,通过它可以轻松的获取全局的资源,但同样因为它贯穿于整个程序的生命周期,使用应该尽可能的少将资源放到全局的单例中。
实际使用:
public enum Filter {
INSTANCE;
private List<NearbyInfo> filterList = new ArrayList<>();
Filter() {
initParam();
}
private void initParam() {
}
public void updateFilterList(List<NearbyInfo> originList){
filterList.clear();
filterList.addAll(originList);
}
public List<FiltrateBean> getFilterList(){
return filterList;
}
}