• java开发中的23种设计模式


    1、定义

    ​ java包含23中设计模式,是一套对代码设计经验的总结,被人们反复利用,多人熟知的代码设计方法

    2、目的

    ​ 为了提高代码的可读性,可扩展性及代码的复用性,为了解决在写代码过程中遇到的代码设计问题。

    3、设计模式的六大原则

    ​ 1、开闭原则:对扩展开放,对修改关闭(尽可能对代码少修改)

    ​ 2、里式替换原则:它是面向对象基本原则之一,如何分类(基类)出现的地方,子类都可以出现,也就是子类可以替换分类的如何功能(体现了父类的扩展性)

    ​ 3、依赖倒转原则:尽可能面向接口编程,依赖接口而不依赖类

    ​ 4、接口隔离原则:一个类如果能实现多个接口,尽可能实现多个接口,为了降低依赖,降低耦合

    ​ 5、最少知道原则:一个实体尽可能少的与其他实体产生相互共良宵,将实体的功能独立

    ​ 6、合成复用原则:尽可能使用合成,集合的方式,而不使用继承

    4、设计模式的分类

    1、创建型模式(5个)

    工厂方法模式、抽象工厂模式、单例模式、建造者模式

    2、结构型模式(7个)

    ​ 适配器模式、装饰模式、代理模式、外观模式、桥接模式、享元模式、组合模式

    3、行为型模式(11个)

    ​ 策略模式、模板方法模式、迭代子模式、观察者模式、责任链模式、命令模式、状态模式、访问者模式、解释器模式、备忘录模式

    5、单例模式

    ​ 单例模式是创建对象的一种特殊模式,程序从始至终都只创建一个对象叫单例(单实例)

    ​ 1、懒汉式单例

    public class Person {
            //懒汉式单例的步骤:
            // 为了不让其他类直接访问该成员
            //1、静态变量
            private static Person person = null;
    
            //使用一个对象调用多次该方法    单例模式完成
            //2、将构造器私有化
            private Person() {
    
            }
    
            //3、提供一个静态的方法,并返回该类对象
            public static Person getInstance() {
                if (person == null) { // 第一次访问
                    person = new Person();
                }
                return person;
            }
        }
    

    2、饿汉式单例

    public class Student {
       // 为了不让其他类直接访问该成员
       //1、静态变量
        private static Student student = new Student();
    
       //2、将构造器私有化
        private Student(){
    
        }
       //3、提供一个静态方法,并返回该类对象
        public static Student getInstance(){
            if (student!=null){
                return student;
            }
                return null;
        }
    }
    

    6、工厂方法模式

    ​ 创建对象的过程不再由当前类实例化,而是由工厂类完成,在工厂类只需要告知 对象类型即可。工厂模式中必须依赖接口

    1、简单工厂模式

    ​ 以生产“电脑”为例,电脑有办公的功能,可以生产一体机或笔记本

    代码与静态工厂一样
    

    2、静态工厂模式

    //电脑接口
    public interface Computer {
        //电脑办公
        public void work();
    }
    
    //笔记本类
    public class PersonComputer implements  Computer{
    
        @Override
        public void work() {
            System.out.println("这是笔记本电脑,正在办公");
        }
    }
    
    //一体机类
    public class WorkComputer implements  Computer{
    
        @Override
        public void work() {
            System.out.println("这是一体机正在办公");
        }
    }
    
    
    public class ComputerFactory {
    //根据不同的类型 生产不同的产品
        public Computer produce(String type){
            Computer computer =null;
            if(type.equals("personComputer")){
                computer = new PersonComputer();
            }else if(type.equals("workComputer")){
                computer = new WorkComputer();
            }else{
                System.out.println("不能生产");
            }
            return computer;
    }
    
         /**
         *  静态工厂方法
         * @param type
         * @return
         */
    public static Computer produce(String type){
            // 定义一个接口的引用    通过接口new 一个实现类的对象
            // 提高扩展性
            Computer computer=null;
             if(type.equals("workComputer")){
                 computer = new WorkComputer();
             }else if(type.equals("personComputer")){
                 computer = new PersonComputer();
             }else{
                 System.out.println("不能创建对象");
             }
             return computer;
        }
    }
    
    public class TestStaticFactory {
     public static void main(String[] args) {
             // 通过工厂类创建对象
            ComputerFactory factory = new ComputerFactory();
            // 要对象 找工厂
            Computer computer1 = factory.produce("workComputer");
            computer1.work();
            // 创建笔记本
            Computer computer2 = factory.produce("personComputer");
            computer2.work();
    
            Computer computer3 = ComputerFactory2.produce("workComputer");
            computer3.work();
     }
    }
    

    3、工厂方法模式

    //汽车接口
    public interface Car {
        public void  showInfo();
    }
    //奥迪类
    public class AudiCar implements Car {
        @Override
        public void showInfo() {
            System.out.println("这是一台奥迪汽车。。");
        }
    }
    //宝马类
    public class BMWCar implements Car {
        @Override
        public void showInfo() {
            System.out.println("这是一台宝马汽车。");
        }
    }
    
    //生产汽车的工厂接口
    public interface CarFactory {
        public Car produce();
    }
    //奥迪工厂
    public class AudiCarFactory implements  CarFactory {
        @Override
        public Car produce() {
    
            return  new AudiCar();// 这里AudiCar是Car的实现类
        }
    }
    //宝马工厂
    public class BMWCarFactory implements CarFactory {
        @Override
        public Car produce() {
            return new BMWCar();// 因为BWMCar是Car的实现类
        }
    }
    
     public class TestFactory {
            public static void main(String[] args) {
                //先创建 汽车工厂
                CarFactory bmwFactory = new BMWCarFactory();
                // 这个工厂生产的汽车就是 宝马
                Car bmw = bmwFactory.produce();
                bmw.showInfo();
        
                //这个模式对于同一级别的产品,可扩展性高
                //可以扩展不同品牌的汽车,此时不需要修改代码,只需要增加代码即可
                // 创建一个新的品牌汽车  大众汽车
        
                CarFactory dazhongFactory = new DazhongCarFactory();
                Car car = dazhongFactory.produce();
                car.showInfo();
            }
        }
    
    

    7、抽象工厂模式

    //迷你汽车接口
    public interface MiniCar {
        public void showInfo();
    }
    //SUV汽车接口
    public interface SUVCar {
        public void showInfo();
    }
    
    //奥迪实现Mini接口类
    public class AudiMiniCar implements  MiniCar {
        @Override
        public void showInfo() {
            System.out.println("这是奥迪迷你汽车 ");
        }
    }
    //宝马实现Mini接口类
    public class BMWMiniCar implements  MiniCar {
        @Override
        public void showInfo() {
            System.out.println("这是宝马Cooper迷你汽车");
        }
    }
    //奥迪实现SUV接口类
    public class AudiSUVCar implements  SUVCar {
        @Override
        public void showInfo() {
            System.out.println("这是一辆 奥迪SUV汽车");
        }
    }
    //宝马实现SUV接口类
    public class BMWSUVCar implements  SUVCar {
        @Override
        public void showInfo() {
            System.out.println("这宝马的SUV系列");
        }
    }
    
    //汽车生产工厂接口
    public interface CarFactory {
        //生成不同型号的汽车 ,两条产品线
        public MiniCar produceMiniCar();
    
        public SUVCar produceSUVCar();
    }
    //奥迪汽车工厂实现汽车工厂接口
    public class AudiCarFactory implements  CarFactory {
        @Override
        public MiniCar produceMiniCar() {
            return new AudiMiniCar();
        }
    
        @Override
        public SUVCar produceSUVCar() {
            return new AudiSUVCar();
        }
    }
    //宝马汽车工厂实现汽车工厂接口
    public class BMWCarFactory implements  CarFactory {
        // 生成迷你汽车的方法,返回MiniCar
        @Override
        public MiniCar produceMiniCar() {
            return new BMWMiniCar();
        }
        //生成SUV汽车的方法, 返回SUVCar
        @Override
        public SUVCar produceSUVCar() {
            return new BMWSUVCar();
        }
    }
    
    public class Testabstractfactory{
        public static void main(String[] args) {
            //创建宝马迷你汽车  找工厂
            CarFactory factory = new BMWCarFactory();
            MiniCar car = factory.produceMiniCar();
            car.showInfo();
        }
    }
    

    总结: 对于简单工厂, 工厂方法模式和44抽象工厂的区别和用途

    1、对于简单工厂(静态和非静态),用于生产同一结构中的任意产品,对于新增产品不适用。

    2、对于工厂方法,在简单工厂的基础上,生产同一个等级结构中的固定产品,可以支持新增产品。

    3、抽象工厂: 用于生产不同种类(品牌)的相同类型(迷你,SUV) ,对于新增品牌可以,不支持新增类型。

    8、模板方法

    ​ 定义:

    ​ 模板方法是一种行为模式,父类的一个方法定义完成这个方法的步骤,但不具体实现具体细节,由子类完成各个步骤的实现,在创建子类对象时,最终的实现过程是子类的方法。

    ​ 模板方法的准备:

    ​ 1、继承关系

    ​ 2、父类是抽象类 :抽象类实现了模板方法,定义了算法的估计

    3、子类继承抽象类:实现抽象方法,完成完整的算法

    public abstract class AbstractPerson {
        /**
         *  定义一个模板方法,用于实现这个方法的基本“骨架”
         *  每一步骤的具体实现由子类完成
         */
        public void preparedSchool(){
            getUp();
    
            dressing();
    
            eat();
    
        }
        //起床
        public abstract void getUp();
        //穿衣服
        public abstract void dressing();
        //吃早餐
        public abstract void eat();
    
    }
    
    
    public class Teacher extends  AbstractPerson {
        @Override
        public void getUp() {
            System.out.println("老师起床,7点半起床");
        }
    
        @Override
        public void dressing() {
            System.out.println("老师要衣服得体,穿工装");
        }
    
        @Override
        public void eat() {
            System.out.println("老师吃早餐。");
        }
    }
    
    public class Test1 {
        public static void main(String[] args) {
              Student stu = new Student();
              stu.preparedSchool();
    
              Teacher teacher = new Teacher();
              teacher.preparedSchool();
    
        }
    }
    
  • 相关阅读:
    mysql索引
    springboot mybatis 后台框架平台 shiro 权限 集成代码生成器
    java 企业网站源码模版 有前后台 springmvc SSM 生成静态化
    java springMVC SSM 操作日志 4级别联动 文件管理 头像编辑 shiro redis
    activiti工作流的web流程设计器整合视频教程 SSM和独立部署
    .Net Core中的ObjectPool
    文件操作、流相关类梳理
    .Net Core中的配置文件源码解析
    .Net Core中依赖注入服务使用总结
    消息中间件RabbitMQ(一)
  • 原文地址:https://www.cnblogs.com/qzwx63/p/13885695.html
Copyright © 2020-2023  润新知