• Java基础5——设计模式


    简单工厂模式

    //创建型模式:简单工厂模式
    public abstract class Animal{
        public abstract void eat();
    }
    public class Dog extends Animal{
        public void eat(){
            System.out.println("狗吃肉");
        }
    }
    public class Cat extends Animal{
        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 type){
            if("dog".equals(type)){
                return new Dog();
            }else if("cat".equals(type)){
                return new Cat();
            }else{
                return null;
            }
        }
    }
    public class AnimalDemo{
        public static void main(String[] args){
            Dog d=new Dog();
            d.eat();
            Cat c=new Cat();
            c.eat();
            System.out.println("-----------");
            //通过工厂来造
            //Dog dd = AnimalFactory.createDog();
            //Cat cc = AnimalFactory.createCat();
            //dd.eat();
            //cc.eat();
            Animal a = AnimalFactory.createAnimal("dog");
            a.eat();//调用的是狗的
            Animal b = AnimalFactory.createAnimal("cat");
            b.eat();//调用的是猫的
        }
    }

    简单工厂模式使得客户端不需要再负责对象的创建,从而明确了各个类的职责
    但是这个静态工厂类负责所有对象的创建,如果有新的对象增加,或者某些对象的创建方式不同,就需要不断的修改工厂类,不利于后期维护

    工厂方法模式

    public interface Factory{
        public abstract Animal createAnimal();
    }
    
    public class DogFactory implements Factory{
        public Animal createAnimal(){
            return new Dog();
        }
    }
    
    public class CatFactory implements Factory{
        public Animal createAnimal(){
            return new Cat();
        }
    }
    
    public class AnimalDemo{
        public static void main(String[] args){
            Factory f=new DogFactory();
            Animal a=f.createAnimal();
            a.eat();
            
            f=new CatFactory();
            a=f.createAnimal();
            a.eat();
        }
    }

    工厂方法模式改变了简单工厂模式的弊端,但是工厂方法模式写起来比较繁琐

    还有一种工厂方式叫抽象工厂方式,可以解决工厂方法模式的弊端 

    单例模式——饿汉式

    特点:对象在内存中只有一份

    如何保证类在内存中只有一个对象
    1 把构造方法私有
    2 在成员位置自己创建一个对象
    3 通过一个公共的方法访问

    public class Student{
        private Student(){
            
        }
        //静态方法只能访问静态资源
        //外界也不能直接改变Student类里面的成员s,所以需要加上private
        private static Student s=new Student();
        
        //构造函数已经私有化了,所以外界只能通过静态的方式来访问getStudent方法
        public static Student getStudent(){
            return s;
        }
    }
    public class StudentDemo{
        public static void main(String[] args){
            Student s1=Student.getStudent();
            Student s2=Student.getStudent();
            System.out.println(s1==s2);
        }
    }

    单例模式——懒汉式

    public class Teacher{
        private Teacher{
            
        }
        private static Teacher t=null;
        
        public static Teacher getTeacher(){
            if(t==null){
                t=new Teacher();
            }
            return t;
        }
    }
    public class TeacherDemo{
        public static void main(String[] args){
            Teacher t1=Teacher.getStudent();
            Teacher t2=Teacher.getStudent();
            System.out.println(t1==t2);
        }
    }

    总之,单例模式的思想就是保证只有一个对象,饿汉式是不会出问题的单例模式,所以开发的时候经常用,而懒汉式是会出问题的,所以面试时经常问

    懒汉式有延迟加载的特点

    懒汉式可能会带来线程安全问题,如果执行环境是多线程,我们有共享数据t, 也有多条语句操作t,如果在t1执行if(t==null)的时候t2也进来了就会创建两个对象所以比较保险的做法是给getTeacher方法加上synchronized关键字

    而饿汉式里面对象初始化就是一个原子性的操作,所以不会出现线程安全问题

    Runtime类的概述和应用

    public class RuntimeDemo{
        public static void main(String[] args) throws IOException{
            //每个Java应用程序都有一个Runtime类实例,使应用程序能够与其运行的环境相连接,可以通过getRuntime方法获取当前运行时
            Runtime r=Runtime.getRuntime();
            //exec方法可以执行dos指令
            r.exec("calc");
        }
    }
    
    //在Runtime类源码内部,可以发现以下源码
    class Runtime{
        private RunTime(){}
        private static Runtime currentRuntime=new Runtime();
        public static Runtime getRuntime(){
            return currentRuntime;
        }
    }
  • 相关阅读:
    DBHelper类
    户籍不在本市并已申请基本养老保险或基本医疗保险关系转移手续销户提取业务办理指南(试行)
    Android 打开/播放电脑的音频/视频文件
    (技术贴)如何鉴定绿茶婊
    Swift初探(一)
    关于android移动终端IM的一些问题
    C++中对象、引用、指针
    TextView
    新API
    开发者必备的6款源码搜索引擎
  • 原文地址:https://www.cnblogs.com/zhaohuiziwo901/p/5252373.html
Copyright © 2020-2023  润新知