一、单例模式
synchronized
就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问,就是同一时刻一个人只能做一件事并且做完了才能做另外一件事
什么叫线程安全:
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,
就是线程安全的
(1)、懒汉式
synchronized(可添加也可不加),解释如上
public class Singleton{
static Singleton single;
public static synchronized Singleton getInstance() {
if(single ==null) {
single =new Singleton();
}
return single;
}
}
(2)、饿汉式
public class Signle{
static Signle signle=new Signle();
public static Signle getInstance(){
return signle;
}
}
饿汉式比懒汉式相对来说粗暴,直接实例化
线程更安全,加载效率更高。
二、工厂模式
提供生成的环境,就是你需要什么就造什么,就类似于餐馆一样,你吃什么菜就炒什么菜
餐馆提供的厨房,厨房负责炒菜,而顾客只需点菜
在代码中我们定义一个接口interface A(厨房),然后定义两个不同类(顾客)分别实现implements接口A,在方法里做不同的事(点不同的菜)
最后提供一个统一入口(餐馆)去访问
定义一个接口 interface
interface DoWork{
public void work();//干什么事
}
定义两个类
Teacher 老师类
class Teacher implements DoWork{
public void work(){
System.out.println("tacher taches student knowlage");
};
}
Student 学生类
class Student implements DoWork{
public void work(){
System.out.println("flow teacher and listen");
};
}
公共访问类 Factory
public class Factory{
写法1
static DoWork getIntance(String flag){
DoWork doWork=null;
switch (flag) {
case "teacher":
doWork=new Teacher();
break;
case "student":
doWork=new Student();
break;
}
return doWork;
}
写法2
public static DoWork newTeacherIntance() {
return new Teacher();
}
public static DoWork newStudentIntance() {
return new Student();
}
}
两种写法都可以,但是写法2能避免写法1参数出错而导致实例化失败从而引起空指针异常
上面写法局限性太大,如果顾客想吃火锅了,这时菜已经上好了,难道换一家再吃?
换一家既不方便也太浪费,怎样解决这个问题既能吃炒菜也能吃火锅呢
引入抽象工厂类
public interface AbstractFactory
{
Listener listener();
Read read();
}
interface Listener
{
void listener();//听
}
interface Read
{
void read();//读
}
还是定义Student类
public class Student implements AbstractFactory{
@Override
public Listener listener() {
System.out.println("listen to teacher");
return null;
}
@Override
public Read read() {
System.out.println("read the book after teacher finishing");
return null;
}
}
思考:在学习英语时,学生听与读是必须的,而对于某些听力能力好的但口语差点人来说,他只想读不想听,认为听是多余的,这时实现AbstractFactory接口重写listener()是否多余呢
三、Builder模式或建造者模式
安卓中最常见的Builder模式运用就是AlertDialog等
当遇到传参个数不固定时,怎么做呢
1、创建MyBuilder类
public class MyBuilder {
String name;
String gride;
int age;
private MyBuilder(MyBuilder.Builder builder){
this.name=builder.name;
this.age=builder.age;
this.gride=builder.gride;
}
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getGride() { return gride; }
public void setGride(String gride) { this.gride = gride; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
2、创建Builder 参数与MyBulider 参数保持一致
public static class Builder{
String name;
String gride; int age;
public Builder setName(String name){ this.name=name; return this; }
public Builder setAge(int age){ this.age=age; return this; }
public Builder setGride(String gride){ this.gride=gride; return this; }
public MyBuilder builder(){
return new MyBuilder(this);
}
}
MyBuilder持有Builder的实例,Builder通过setXX()来设定值
四、状态模式
五、装饰模式