设计模式

一、单例模式

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()来设定值



四、状态模式



五、装饰模式

你可能感兴趣的:(设计模式)