java设计模式之模板设计模式和单例模式,以及复合

模板设计模式
模板设计模式的设计思想是当程序由确定的部分和不确定的部分组成的时候,这时候我们把不确定的部分抽象出来,然后对外开放一个可以访问的方法,在使用的时候,由其子类来继承并实现重写方法,完成不确定的部分.
例如:我们要计算数组的长度

abstract class GetLength
{
    abstract public void getLength();//抽象方法
}
class Length extends GetLength
{
    int[] array;
    public  Length(int[] array) 
    {
        this.array = array;
    }
    @Override
    public void getLength()     //子类中重写抽象方法来实现需求  
    {
        System.out.println("数组的长度为"+this.array.length);

    }
}

单例设计模式
单例设计模式是指无论我们定义了多少个该类的对象,都始终是同一个对象,该对象就是单例对象
单例的书写格式有两种:
1.恶汉式:在类加载的时候单例就被加载出来了
2.懒汉式:只有在对象被创建的时候才被加载出来

我们先看一下恶汉式的单例格式

class Single
{
//定义一个Single类的对象
private static Single single = new Single();
//将构造方法私有化,这样外界就无法直接实例化对象了
private Single()
//对外开放一个公共访问的路径
public static Single getInstance()
{
return this.single;
}
}

在类开始加载到方法区的时候,single对象就已经被创建出来,因为single对象是在方法区的静态区,所以以后创建的都是静态区的这个single对象.
在内存中的表现如下图
这里写图片描述
下面我们再来看一看懒汉式的单例格式:

class Single
{
//声明一个single类对象
private static Single single ;
 //将构造方法私有化
 private Single()
 {
 }
 //开放一个公共的访问方法
 public static Single getInstance()
 {
 if(this.single == null)
 {
  this.single = new Single();//在调用该get方法的时候再创建单例对象
 }
 return this.single;
 }
}

复合
复合一般是指,一个类中有另一个类的对象,而另一个类也有该类的对象
下面我们来看一道例题
写两个类分别是儿子,爸爸.
爸爸类中有姓名,性别,年龄,类中的方法是介绍自己并介绍自己的儿子
儿子类中有姓名,性别,年龄,类中的方法是介绍自己并介绍自己的爸爸

//现将两者的公共部分抽取出来写一个Person父类,然后让两个类都继承Person类
class Person
{
    String name;
    String gender;
    int   age;
    public  Person(String name,String gender,int age) 
    {
        this.name = name;
        this.gender = gender;
        this.age =age;
    }
    public void sayHi() 
    {
        System.out.println("我是"+this.name+",性别是"+this.gender+",我今年"+this.age+"岁");
    }
}
class Father extends Person
{
    Son son; //直接将Son类的对象作为Father类中的成员变量
    public Father(String name,String gender,int age)//在复用中,我们一般先给两者共同的部分赋值,不同的部分,单独赋值
    {
        super(name, gender, age);
    }
    public void mySon() 
    {
        System.out.println("我的儿子是"+son.name);
    }

}
class Son extends Person
{
    Father father;//复用中,不同的成员变量单独赋值
    public  Son(String name,String gender,int age) 
    {
        super(name, gender, age);
    }
    public void myFather() 
    {
        System.out.println("我的爸爸是"+this.father.name);
    }
}
Father father = new Father("张三", "男", 50);
    Son son = new Son("李四", "男", 30);
    father.son = son;                 //这里对特有的对象单独赋值
    son.father = father;
    son.sayHi();
    son.myFather();
    father.sayHi();
    father.mySon();

输出结果是:
我是李四,性别是男,我今年30岁
我的爸爸是张三
我是张三,性别是男,我今年50岁
我的儿子是李四

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值