设计模式

设计模式的概述及分类、创建型模式的分类

/*
设计模式:(设计模板,开发思想)
      --经验的总结。

分为三大类型:

    A:创建型 创建对象
    B:结构型 对象的组成
    C:行为型 对象的功能

今天重点说一下创建型

创建型模式:
    1、单例模式(重点掌握)
              饿汉式
              懒汉式
    2、简单工厂模式
    3、工厂方法模式
*/

单例模式、饿汉式

public class Student {
  //静态的只能访问静态的
    private static Student s = new Student();

  //构造方法私有化
    private Student(){}

  //静态方法--通过类名调用
    public static Student getStudent(){
        return s;
    }
}

/*
    单例模式:保证类在内存中始终只有一个对象

    如何保证类在内存只有一个对象呢?
        1、构造方法私有化(外界不能创建对象)
        2、在类的成员变量的位置上创建一个对象
        3、提供一个公共的方法给外界获取到该对象

    通过观察发现,我们随着Student类的加载,对象就创建好了,(静态的)
    通过观察发现,这个模式是单例模式中的饿汉式。
    --无论你通不通过getStudent()方法创建Student类的对象,
    我Student类中都有一个学生对象
*/

public class StudentDemo {
    public static void main(String[] args) {
      //通过getStudent()方法获取学生对象
        Student s1 = Student.getStudent();
        Student s2 = Student.getStudent();

      //判断s1与s2是否相等
      //如果相等说明只有一个对象
        System.out.println(s1==s2);//true
        System.out.println(s1);
        System.out.println(s2);
    }
}

懒汉式

public class Teacher {
    //构造方法私有化
    private Teacher() {
    }

    private static Teacher t = null;
  
//    //假设现在有三个线程t1,t2,t3--可能会存在线程安全问题
//    public static Teacher getTeacher() {
//            //判断是否有对象
//            if (t == null) {
//                //假设将来t1进来了,但是还没有创建对象的时候
//                //此时CPU的时间片被t2抢走了,t2也进来了。
//                //t3同理
//                t = new Teacher();
//            }
//            return t;
//    }

//    //加锁--同步代码块(静态的)
//    public static Teacher getTeacher() {
//        synchronized (Teacher.class){
//            //判断是否有对象
//            if (t == null) {
//                //假设将来t1进来了,但是还没有创建对象的时候
//                //此时CPU的时间片被t2抢走了,t2也进来了。
//                //t3同理
//                t = new Teacher();
//            }
//            return t;
//        }
//    }

    //加锁--线程同步安全的方法
    public synchronized static Teacher getTeacher() {
            if (t == null) {
                //t1,t2,t3
                t = new Teacher();
            }
            return t;
    }
}

/*
    饿汉式:类一加载,就去创建对象
    懒汉式:用的时候,再去创建对象
         特点:
            1、懒加载(延迟加载)
            2、容易产生线程安全问题
                1) 是否存在多线程环境 是
                2) 是否存在共享数据  是  
                3) 是否存在多条语句操作共享数据  是

   开发中用谁呢?饿汉式
   面试的时候,说懒汉式,因为牵扯到线程安全的问题
*/

public class TeacherDemo {
    public static void main(String[] args) {
        Teacher t1 = Teacher.getTeacher();
        Teacher t2 = Teacher.getTeacher();

      //但是假如有多线程环境,懒汉式将来会容易产生线程安全问题
        System.out.println(t1==t2);//true
        System.out.println(t1);
        System.out.println(t2);
    }
}

简单工厂模式

//定义一个抽象的动物类
public abstract class Animal {
    //抽象的吃的方法
    public abstract void eat();
}

//定义一个狗继承动物类
public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗吃肉");
    }
}

//定义一个猫继承动物类
public class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃🐟");
    }
}

public class AnimalFactory {
//将构造方法私有化让外部无法创建该类对象
    private AnimalFactory(){}

//  定义一个静态的创建狗的对象的方法
//    public static Dog createDog(){
//        return new Dog();
//    }
//  定义一个静态的创建猫的对象的方法
//    public static Cat createCat(){
//        return new Cat();
//    }

    //用多态改进,多态创建对象
    public static Animal createAnimal(String name){
        if("dog".equals(name)){
            return new Dog();
        }else if("cat".equals(name)){
            return new Cat();
        }else {
            return null;
        }
    }

/*
        简单工厂模式(静态工厂方法模式)
*/

public class AnimalDemo {
    public static void main(String[] args) {
//	开发中一般来说测试类(客户端)是不创建对象的
//        Dog dog = new Dog();
//        dog.eat();
//        Cat cat = new Cat();
//        cat.eat();

//        现在有一个动物工厂去造一些动物
//        调用工厂中的静态创造狗的对象的方法创建狗的对象
//        Dog dog = AnimalFactory.createDog();
//        dog.eat();
//        同理,创建猫的对象
//        Cat cat = AnimalFactory.createCat();
//        cat.eat();

        //假设工厂想造猪
        //需要修改工厂类,添加创建猪的方法
        //然后再调用,比较复杂

        //通过多态改进后
        Animal dog = AnimalFactory.createAnimal("dog");
        if(dog!=null){
            dog.eat();
        }

        Animal cat = AnimalFactory.createAnimal("cat");
        cat.eat();
      
        Animal pig = AnimalFactory.createAnimal("pig");
        //NullPointerException-空指针异常
        //pig.eat();
        //加入判断,判断pig是否为null
        if(pig!=null){
            pig.eat();
        }else {
            System.out.println("该工厂目前还不生产猪");
        }
    }
}

工厂方法模式

//定义一个抽象的动物类
public abstract class Animal {
    //抽象的吃的方法
    public abstract void eat();
}

//定义一个狗继承动物类
public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗吃肉");
    }
}

//定义一个猫继承动物类
public class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃🐟");
    }
}

//定义一个猪继承动物类
public class Pig extends Animal {
    @Override
    public void eat() {
        System.out.println("猪吃康");
    }
}

//定义一个工厂接口
public interface Factory {
  //定义一个抽象的制造动物的方法
    public abstract Animal createAnimal();
}

//定义一个造狗的工厂实现工厂接口
public class DogFactory implements Factory{
  //重写抽象的制造动物的方法
    @Override
    public Animal createAnimal() {
        return new Dog();
    }
}

//定义一个造猫的工厂实现工厂接口
public class CatFactory implements Factory {
  //重写抽象的制造动物的方法
    @Override
    public Animal createAnimal() {
        return new Cat();
    }
}

//定义一个造猪的工厂实现工厂接口
public class PigFactory implements Factory {
    @Override
    public Animal createAnimal() {
        return new Pig();
    }
}

/*
    工厂方法模式

    回想一下上一个简单工厂模式的时候,如果我想创造一个新的动物,得去修改工厂类
    正常情况下,你没有权限修改工厂类,就不能在原来工厂基础上进行修改
    但是我依旧想实现该功能怎么办呢?使用工厂方法模式开发
*/

public class AnimalDemo {
    public static void main(String[] args) {
        //我想要造一只狗
        //创建实现了工厂接口的狗工厂的对象
        DogFactory dogFactory = new DogFactory();
        //调用重写抽象的制造动物的方法,返回Animal类的对象
        //多态的形式
        Animal animal = dogFactory.createAnimal(); //new Dog();
        animal.eat();

        //。。。
        CatFactory catFactory = new CatFactory();
        Animal animal1 = catFactory.createAnimal();
        animal1.eat();

        //。。。
        PigFactory pigFactory = new PigFactory();
        Animal animal2 = pigFactory.createAnimal();
        animal2.eat(); 
    }
}
posted @ 2022-01-01 13:21  赤兔胭脂小吕布  阅读(20)  评论(0编辑  收藏  举报