设计模式:
设计模式基本原则:
S:单一职责原则
O:开放关闭原则
L:里氏替换原则
抽象
只要父类能出现的地方子类就可以出现,且替换为子类不会产生错误或异常
主要继承、多态
I:接口隔离原则
D:依赖倒置原则
接口或抽象类
面向接口编程或面向抽象编程
依赖通过抽象产生
SOLID
抽象、单一职责、最小化
最少知识原则(迪米特原则)
一、单例模式
1.确保某个类有且只有一个对象
实现单例模式的关键点:
(1)构造函数不对外开放,一般为private
(2)通过一个静态方法或者枚举返回单例类对象
(3)保证多线程环境下单例类的对象有且只有一个
(4)确保单例类对象在反序列化时不会重新构建对象
2.单例模式的写法
(1)饿汉单例模式
在声明的时候被初始化
public class A{
private static final A a = new A();
private A(){
}
//公有的静态函数,对外暴露获取单利对象的接口
public static A getA(){
return a;
}
}
A 为静态对象,并且在声明的时候被初始化,保证了对象的唯一性
(2)懒汉模式
声明一个静态对象,并且在用户第一次调用getInstance时初始化
public class Singleton{
private static Singleton instance;
private Singleton(){
}
public static synchronized Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
同步会造成不必要的开销,一般不建议使用
(3)Double Check Lock模式
能在需要时才初始化实例,又能保证线程安全,且单例对象初始化后调用getInstance不进行同步锁
public class Singleton{
private static Singleton instance = null;
private Singleton(){
}
public static Singleton getInstance(){
//为了避免不必要的同步
if(instance == null){
synchronized(Singleton.class){
//在null时创建实例
if(instance == null){
//分配内存;调用构造函数,初始化成员字段;对象指向分配内存空间
instance = new Singleton();
}
}
}
return instance;
}
}
volatile关键字
volatile是一个类型修饰符(type specifier),就像大家更熟悉的const一样,它是被设计用来修饰被不同线程访问和修改的变量
(4)静态内部类单例模式
推荐使用
第一次调用时才会初始化
public class Singleton{
private Singleton(){
}
public static Singleton getInstance(){
return SingletonHolder.sinstance;
}
private static class SingletonHolder{
private static final Singleton sinstance = new Singleton();
}
}
(5)枚举单例
(6)容器单例
各种系统服务会注册到ContextImpl的一个map容器中,然后通过服务的字符串键值来取
二、Builder模式
顾客购买套餐
抽象建造者角色(Builder):——
为创建一个Product对象的各个部件指定抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此角色规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。
具体建造者(ConcreteBuilder)————“餐厅员工”
1)实现Builder的接口以构造和装配该产品的各个部件。即实现抽象建造者角色Builder的方法。
2)定义并明确它所创建的表示,即针对不同的商业逻辑,具体化复杂对象的各部分的创建
3) 提供一个检索产品的接口
4) 构造一个使用Builder接口的对象即在指导者的调用下创建产品实例
指导者(Director):————“收银员” 统一组装过程
调用具体建造者角色以创建产品对象的各个部分。指导者并没有涉及具体产品类的信息,真正拥有具体产品的信息是具体建造者对象。它只负责保证对象各部分完整创建或按某种顺序创建。
产品角色(Product):——————“汉堡套餐”
建造中的复杂对象。它要包含那些定义组件的类,包括将这些组件装配成产品的接口。
Product类
Builder接口 定义getProduct()
ConcreteBuilder实现Builer接口 具体实现Product
Director类 定义builder,执行builder.getProduct
Computer
MacBook
Builder
MacBookBuilder
Director
链式调用
new TestBuilder().setA("A").setB("B").create();
android中使用:dialog组装信息,show()
windowManager
windowManagerGlobal
windowManagerService(WMS)
Surface
SurfaceFiling
studio中InnerBuilder插件可自动生成
(1)通过Context的getSystemService()
三、工厂模式
复杂对象
Product 抽象产品
ConcreteProductA 具体产品
ConcreteProductB
concreteFactory:具体工厂类
Factory:抽象工厂类, public adstract Product createProduct();
Client
建造者模式强调组装,工厂模式强调创建
interface Iterable<T>----Collection----List、Set
四、抽象工厂模式
四类方法
AbstractFactory:抽象工厂角色
设计模式基本原则:
S:单一职责原则
O:开放关闭原则
L:里氏替换原则
抽象
只要父类能出现的地方子类就可以出现,且替换为子类不会产生错误或异常
主要继承、多态
I:接口隔离原则
D:依赖倒置原则
接口或抽象类
面向接口编程或面向抽象编程
依赖通过抽象产生
SOLID
抽象、单一职责、最小化
最少知识原则(迪米特原则)
一、单例模式
1.确保某个类有且只有一个对象
实现单例模式的关键点:
(1)构造函数不对外开放,一般为private
(2)通过一个静态方法或者枚举返回单例类对象
(3)保证多线程环境下单例类的对象有且只有一个
(4)确保单例类对象在反序列化时不会重新构建对象
2.单例模式的写法
(1)饿汉单例模式
在声明的时候被初始化
public class A{
private static final A a = new A();
private A(){
}
//公有的静态函数,对外暴露获取单利对象的接口
public static A getA(){
return a;
}
}
A 为静态对象,并且在声明的时候被初始化,保证了对象的唯一性
(2)懒汉模式
声明一个静态对象,并且在用户第一次调用getInstance时初始化
public class Singleton{
private static Singleton instance;
private Singleton(){
}
public static synchronized Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
同步会造成不必要的开销,一般不建议使用
(3)Double Check Lock模式
能在需要时才初始化实例,又能保证线程安全,且单例对象初始化后调用getInstance不进行同步锁
public class Singleton{
private static Singleton instance = null;
private Singleton(){
}
public static Singleton getInstance(){
//为了避免不必要的同步
if(instance == null){
synchronized(Singleton.class){
//在null时创建实例
if(instance == null){
//分配内存;调用构造函数,初始化成员字段;对象指向分配内存空间
instance = new Singleton();
}
}
}
return instance;
}
}
volatile关键字
volatile是一个类型修饰符(type specifier),就像大家更熟悉的const一样,它是被设计用来修饰被不同线程访问和修改的变量
(4)静态内部类单例模式
推荐使用
第一次调用时才会初始化
public class Singleton{
private Singleton(){
}
public static Singleton getInstance(){
return SingletonHolder.sinstance;
}
private static class SingletonHolder{
private static final Singleton sinstance = new Singleton();
}
}
(5)枚举单例
(6)容器单例
各种系统服务会注册到ContextImpl的一个map容器中,然后通过服务的字符串键值来取
二、Builder模式
顾客购买套餐
抽象建造者角色(Builder):——
为创建一个Product对象的各个部件指定抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此角色规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。
具体建造者(ConcreteBuilder)————“餐厅员工”
1)实现Builder的接口以构造和装配该产品的各个部件。即实现抽象建造者角色Builder的方法。
2)定义并明确它所创建的表示,即针对不同的商业逻辑,具体化复杂对象的各部分的创建
3) 提供一个检索产品的接口
4) 构造一个使用Builder接口的对象即在指导者的调用下创建产品实例
指导者(Director):————“收银员” 统一组装过程
调用具体建造者角色以创建产品对象的各个部分。指导者并没有涉及具体产品类的信息,真正拥有具体产品的信息是具体建造者对象。它只负责保证对象各部分完整创建或按某种顺序创建。
产品角色(Product):——————“汉堡套餐”
建造中的复杂对象。它要包含那些定义组件的类,包括将这些组件装配成产品的接口。
Product类
Builder接口 定义getProduct()
ConcreteBuilder实现Builer接口 具体实现Product
Director类 定义builder,执行builder.getProduct
Computer
MacBook
Builder
MacBookBuilder
Director
链式调用
new TestBuilder().setA("A").setB("B").create();
android中使用:dialog组装信息,show()
windowManager
windowManagerGlobal
windowManagerService(WMS)
Surface
SurfaceFiling
studio中InnerBuilder插件可自动生成
(1)通过Context的getSystemService()
三、工厂模式
复杂对象
Product 抽象产品
ConcreteProductA 具体产品
ConcreteProductB
concreteFactory:具体工厂类
Factory:抽象工厂类, public adstract Product createProduct();
Client
建造者模式强调组装,工厂模式强调创建
interface Iterable<T>----Collection----List、Set
四、抽象工厂模式
四类方法
AbstractFactory:抽象工厂角色