Java-设计模式

1. 设计模式

经验的总结
  • 1.创建型 创建对象
  • 2.结构型 对象的组成
  • 3.行为型 对象的功能

创建型模式

单例模式:指的是在程序的运行过程中,内存只允许有一个对象存在

如何保障类在内存只有一个对象呢?

  • 1、构造方法私有化
  • 2、在类的内部成员变量位置上创建一个对象
  • 3、提供公共的方法将唯一的对象返回出来获取
饿汉式:类一加载,对象就创建好了。
代码如下:

学生类:

public class Student {
    private static Student student =new Student();

    private Student(){
    }
    public static Student makeStudent(){
        return student;
    }
}

测试类

public class StudentDemo {
    public static void main(String[] args) {
        Student s1 = Student.makeStudent();
        Student s2 = Student.makeStudent();

        System.out.println(s1 == s2); //true
        System.out.println(s1); //com.bigdat.java.day28.danlimoshi.Student@1b6d3586
        System.out.println(s2); //com.bigdat.java.day28.danlimoshi.Student@1b6d3586
    }
}
懒汉式:用的时候,再去创建对象

Teacher类

public class Teacher {

    private static Teacher teacher = null;

    private Teacher() {
    }

    //t1,t2,t3
//    public static Teacher getTeacher() {
//        synchronized (Teacher.class){
//            if (teacher == null) {
//                //t1,t2,t3
//                teacher = new Teacher();
//            }
//
//            return teacher;
//        }
//    }

    public synchronized static Teacher getTeacher() {
        if (teacher == null) {
            //t1,t2,t3
            teacher = new Teacher();
        }

        return teacher;
    }
}

测试类

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

        System.out.println(t1 == t2); //true
        System.out.println(t1);       // com.bigdat.java.day28.danlimoshi.Teacher@1b6d3586
        System.out.println(t2);       // com.bigdat.java.day28.danlimoshi.Teacher@1b6d3586
    }
}

面试题:你知道java中的单例模式吗?开发中你喜欢用哪一种?

  • 知道,有饿汉式和懒汉式,饿汉式是指类加载的时候,对象就创建好了,懒汉式指的是用的时候再去创建对象
    但是,开发中使用饿汉式,因为懒汉式可能会有线程安全问题。

简单工厂模式

-https://blog.csdn.net/a745233700/article/details/120253639 ——百度搜索更详解释

  • 简单工厂模式的核心是定义一个创建对象的接口,将对象的创建和本身的业务逻辑分离
简单工厂模式的优缺点
  • 优点:简单工厂模式提供专门的工厂类用于创建对象,实现了对象创建和使用的职责分离,客户端不需知道所创建的具体产品类的类名以及创建过程,只需知道具体产品类所对应的参数即可,通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。
  • 缺点:在于不符合“开闭原则”,每次添加新产品就需要修改工厂类。在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展维护,并且工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
代码如下:

猫类

public class Cat extends Animal{
    @Override
    public void eat() {
        System.out.println("猫吃鱼...");
    }
}

狗类:

public class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("狗吃肉...");
    }
}

动物类:

public abstract class Animal {
     public abstract void eat();
}

动物工厂类:

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

    //利用多态来创建对象
    public static Animal createAnimal(String name){
        if ("cat".equals(name)){
            return  new Cat();
        }else if ("dog".equals(name)){
            return new Dog();
        }else{
            System.out.println("动物工程暂不支持"+name+"类动物的培养!");
            return null;
        }
    }
}

测试类:

public class AnimalDemo {
    public static void main(String[] args) {
        //一般创建对象的方法 创建一只猫和一只狗
//        Animal cat = new Cat();
//        cat.eat();
//        Animal dog = new Dog();
//        dog.eat();

        //工厂方法来创建对象
        Animal animal = AnimalFactory.createAnimal("dog");
        Dog dog = (Dog)animal;
        dog.eat();

        Animal elephant = AnimalFactory.createAnimal("elephant");
        elephant.eat();
    }
}

工厂方法模式

  • 工厂方法模式将工厂抽象化,并定义一个创建对象的接口。每增加新产品,只需增加该产品以及对应的具体实现工厂类,由具体工厂类决定要实例化的产品是哪个,将对象的创建与实例化延迟到子类,这样工厂的设计就符合“开闭原则”了,扩展时不必去修改原来的代码。在使用时,用于只需知道产品对应的具体工厂,关注具体的创建过程,甚至不需要知道具体产品类的类名,当我们选择哪个具体工厂时,就已经决定了实际创建的产品是哪个了。

猫类

public class Cat extends Animal{
    @Override
    public void eat() {
        System.out.println("小猫吃鱼!!!");
    }
}

狗类

public class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("小狗吃肉!!!");
    }
}

动物类

public abstract class Animal {
    public abstract void eat();
}

工厂类

/*
   抽象工厂
            由具体的动物工厂来继承,然后造具体动物
 */
public abstract class Factory{
    public abstract Animal createAnimal();
}

猫工厂类

public class CatFactory extends Factory{
    @Override
    public Animal createAnimal() {
        return new Cat();
    }
}

测试类

public class AnimalDemo {
    public static void main(String[] args) {
        CatFactory catFactory = new CatFactory();
        Animal cat = catFactory.createAnimal();
        cat.eat();
    }
}

————————————————
版权声明:本文为CSDN博主「张维鹏」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a745233700/article/details/120253639

posted @ 2022-04-13 14:32  a-tao必须奥利给  阅读(19)  评论(0编辑  收藏  举报