第十一节(单例模式初步、类的继承)

设计模式 

什么是设计模式:设计模式是可以重复利用的解决方案

设计模式的提出是在 1995 人,是由 4 为作者提出的,称为 GoF, 也就是“四人组”

设计模式从结构上分为三类:

  创建型

  结构性

  行为型
其中最简单的设计模式就是单例了,单例这种模式,尽量少用,也有将其称为“反模式” 

单例模式有什么好处:

我们知道对象实例创建完成后, 会放到堆中, 如果堆中的实例过多, 将会存在特别多的垃圾,这样会导致一些问题, 如内存溢出等,

使用单例模式后,只会创建一个实例,显著减少对象实例的个数,同时也会提高性能,因为不会频繁的创建对象,这只是他的一个好处,

其他方面项目中再说。

单例模式的三要素:

一.  在类体中需要具有静态的私有的本类型的变量

二.  构造方法必须是私有的

三. 提供一个公共的静态的入口点方法

 

单利模式分为两种:
1. 饿汉式单利模式:在类加载阶段就创建了对象
2. 懒汉式单利模式:用到对象时才会创建对象

/*
    实现单例模式

        单例模式的要领:
            1. 构造方法私有化
            2. 对外提供一个公开的静态的获取当前类型的对象的方法
            3. 提供一个当前类型的静态变量

        单利模式分为两种:
            1. 饿汉式单利模式:在类加载阶段就创建了对象
            2. 懒汉式单利模式:用到对象时才会创建对象

*/
public class Singleton{ // 懒汉式

    // 静态变量
    private static Singleton s;

    // 将构造方法私有化 空构造(如果我们没有自定义构造方法时,系统自动会有一个默认的空构造)
    private Singleton(){}

    //  对外提供一个公开获取Singleton对象的方法
    public static Singleton getInstance(){
        if(s == null){
            s = new Singleton();
        }

        return s;

    }
}

/*
    调用懒汉式 设计模式 ,输出的是同一个内存地址

*/
public class Test01{

    public static void main(String[] args){

        /* 编译不通过(构造方法私有化了)
            Singleton s1 = new Singleton();
            Singleton s2 = new Singleton();

            System.out.println(s1 == s2);
        */

        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        Singleton s3 = Singleton.getInstance();

        System.out.println(s1 == s2); // 输出 true
        System.out.println(s2 == s3); // 输出 true
    }

}

/////////////////////////////////////////
/*
    饿汉式单例模式
*/
public class User{

    // 类加载时,只执行一次
    private static User user = new User();

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

    // 提供公开的方法
    public static User getInstance(){
        return user;
    }

}
/*
    调用 饿汉式单例模式
*/
public class Test02{

    public static void main(String[] args){

        User u1 = User.getInstance();
        User u2 = User.getInstance();

        System.out.println(u1 == u2); // 输出 true

    }

}
类的继承

面向对象的三大特性:

封装(封装细节)

继承

多态

继承是面向对象的重要概念,软件中的继承和现实中的继承概念是一样的

继承是实现软件可重用性的重要手段, 如:A 继承 B,A 就拥有了 B 的所有特性,如现

实世界中的儿子继承父亲的财产,儿子不用努力就有了财产,这就是重用性

java 中只支持类的单继承,也就是说 A 只能继承 B,A 不能同时继承 C

java 中的继承使用 extends 关键字,语法格式:

[修饰符] class 子类 extends 父类 {

}
例题1:public class Person{

    // 姓名
    private String name;
    // 性别
    private boolean sex;
    // 年龄
    private int age;

    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }

    public void setSex(boolean sex){
        this.sex = sex;
    }
    public boolean getSex(){
        return sex;
    }

    public void setAge(int age){
        this.age = age;
    }
    public int getAge(){
        return age;
    }        

}

public class Student{

    // 学号
    private int id;
    // 姓名
    private String name;
    // 性别
    private boolean sex;
    // 年龄
    private int age;

    public void setId(int id){
        this.id = id;
    }
    public int getId(){
        return id;
    }

    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }

    public void setSex(boolean sex){
        this.sex = sex;
    }
    public boolean getSex(){
        return sex;
    }

    public void setAge(int age){
        this.age = age;
    }
    public int getAge(){
        return age;
    }    

}

public class Student01 extends Person{ //继承了Person类 即拥有了Person类的全部属性

    // 学号
    private int id;

    // 班级编号
    private int classId;

    public void setId(int id){
        this.id = id;
    }
    public int getId(){
        return id;
    }

}

public class ExtendsTest01{

    public static void main(String[] args){

        Student s = new Student();
        s.setId(10001);
        s.setName("ming");
        s.setSex(true);
        s.setAge(18);

        Student s1 = new Student();
        s1.setId(10002);
        s1.setName("ming哥");
        s1.setSex(true);
        s1.setAge(48);        

        System.out.println("id = " + s.getId());
        System.out.println("name = " + s.getName());
        System.out.println("sex = " + s.getSex());
        System.out.println("age = " + s.getAge());

        System.out.println("id = " + s1.getId());
        System.out.println("name = " + s1.getName());
        System.out.println("sex = " + s1.getSex());
        System.out.println("age = " + s1.getAge());

    }

}
				
时间: 2024-10-18 11:41:39

第十一节(单例模式初步、类的继承)的相关文章

第十一周 项目3 - 点类派生直线类】定义点类Point,并以点类为基类,继承关系

项目3 - 点类派生直线类]定义点类Point,并以点类为基类,派生出直线类Line,从基类中继承的点的信息表示直线的中点.请阅读下面的代码,并将缺少的部分写出来. [cpp] view plaincopyprint? #include<iostream> #include<Cmath> using namespace std; class Point //定义坐标点类 { public: Point():x(0),y(0) {}; Point(double x0, double 

Python基础总结之初步认识---class类的继承(下)。第十五天开始(新手可相互督促

年薪百万的步伐慢了两天hhhh严格意义是三天.最近买了新的玩具,在家玩玩玩!~~~~ 今天开始正式认识类的继承.类的继承是怎么继承呢?看下代码: 1 class Animal(object): #父类 2 def __init__(self,name): #构造函数的参数 3 self.name = name #实例属性 4 5 class Dog(Animal): #子类(父类) 表明谁继承了谁的所有属性和方法 pass 在上面的代码中,父类的名字是:Animal   子类的名字是:Dog  

【Unity】NGUI插件核心脚本类的继承关系

虽说目前(2015年3月28日)Unity4.6版本之后推出的UGUI系统替代NGUI已是大势所趋, 但作为被长久且广泛使用的优秀插件之一,NGUI的代码和架构依然有很多地方值得我们学习和借鉴. 本文整理了NGUI插件中的核心组件和功能组件脚本类的继承关系,并以图示的方式给出了初步分类. 原文首发:http://blog.csdn.net/duzixi 官方资料:http://www.tasharen.com/forum/index.php?topic=6754.0 NGUI版本:3.6.0

第二百四十一节,Bootstrap进度条媒体对象和 Well 组件

第二百四十一节,Bootstrap进度条媒体对象和 Well 组件 学习要点: 1.Well 组件 2.进度条组件 3.媒体对象组件 本节课我们主要学习一下 Bootstrap 的三个组件功能:Well 组件.进度条组件.媒体对 象组件. 一.Well 组件 这个组件可以实现简单的嵌入效果. 嵌入效果 well样式class类,写在<div>里,设置一个div区块嵌入效果(Bootstrap)well-lg样式class类,写在<div>里,设置一个div区块嵌入效果大尺寸(Boo

[ExtJS学习笔记]第六节 Extjs的类系统Class System命名规则及定义和调试

本文地址: http://blog.csdn.net/sushengmiyan/article/details/38479079 本文作者:sushengmiyan -------------------------------------------------------------资源链接----------------------------------------------------------------------- 翻译来源  Sencha Cmd官方网站:    http:

delphi 线程教学第四节:多线程类的改进

第四节:多线程类的改进 1.需要改进的地方 a) 让线程类结束时不自动释放,以便符合 delphi 的用法.即 FreeOnTerminate:=false; b) 改造 Create 的参数,让它适合访问 COM 组件.如:在线程时空中能够创建 TAdoConnection; c) 设计一个接口能将一个过程( procedure )塞到线程时空中去运行的功能,这样,不必每次重载 Execute 函数. d) 设计一个输出信息的接口 下一节,将讲解如何用多个线程同时执行相同的任务 改进后的多线程

第十一周(点类派生直线类)

/* *copyright(c) 2015,烟台大学计算机学院 *All rights reserved. *文件名称:第十一周(点类派生直线类) *作者:王忠 *完成日期:2015.5.20 *版本号:v1.0 * *问题描述:定义点类Point,并以点类为基类,派生出直线类Line,从基类中继承的点的信息表示直线的中点.请阅读下面的代码,并将缺少的部分写出来. *输入描述: *程序输出: #include<iostream> #include<Cmath> using name

C++ Primer 学习笔记_71_面向对象编程 --句柄类与继承

面向对象编程 --句柄类与继承 引言: C++中面向对象编程的一个颇具讽刺意味的地方是:不能使用对象支持面向对象编程,相反,必须使用指针或引用. void get_prices(Item_base object, Item_base *pointer, Item_base &reference){ //需要根据指针或引用实际所绑定的类型进行调用 cout<< pointer ->net_price(1)<< endl; cout<< reference.n

53)PHP,类的继承

详见   视频第十七天  中的第二节 类的继承 所以   类之间的继承就是一种新的关系的建立,并不是将父类的东西重新复制给子类--------------------- 当你实例化一个类的时候,调用它的方法,首先看它本身的类有没有这个方法,要是没有找到,就去看这个类还有没有继承的关系,亚欧是有继承的关系,就去找他的父类或者以上的类,要是在他的服了或者以上的类找到了这个方法,就会在这个对象身上实现这个方法. 但是要是遇到和父类名字一样的函数的话,这种现象叫做重写,但是我觉得,这个就是一个新的方法定