原型模式(Java、Python)、单例模式(Java、Python)

目录

一、设计一个客户类Customer,其中客户地址存储在地址类Address中,用浅克隆和深克隆分别实现Customer对象的复制并比较这两种克隆方式的异同。绘制类图并编程实现。

1.1 浅克隆实现Customer对象复制:

1.2 深克隆实现Customer对象复制(Java)

二、使用单例模式的思想实现多例模式,确保系统中某个类的对象只能存在有限个,如两个或三个,设计并编写代码实现一个多例类。

2.1使用单例模式实现多例模式结构图


 这里对原型模式就不做详细介绍了,主要是单例模式。

原型模式:在创建一个对象的时候,直接从另外一个复制过来,用的不太多。

单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点(优点:1.对唯一实例的受控访问;2.单例相当于全局变量,但防止了命名空间被污染。)

单例模式示例

#!/usr/bin/env python
# _*_ coding: utf-8 _*_
# @Time : 
# @Author : 
# @Version:V 0.1
# @File : 单例模式.py
# @desc : 保证一个类只有一个实例,并提供一个访问它的全局访问点


class Singleton:
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, "_instance"):
            cls._instance = super(Singleton, cls).__new__(cls)
        return cls._instance


class MyClass(Singleton):
    def __init__(self, a):
        self.a = a


a = MyClass(10)
b = MyClass(20)

print(a.a)
print(b.a)
print(id(a), id(b))


一、设计一个客户类Customer,其中客户地址存储在地址类Address中,用浅克隆和深克隆分别实现Customer对象的复制并比较这两种克隆方式的异同。绘制类图并编程实现。

通常情况下,一个类包含一些成员对象,在使用原型模式克隆对象时,根据其成员对象是否也克隆,原型模式可以分为两种形式:深克隆与浅克隆,下面分别使用这两种方式来实现Customer对象的复制。

1.1 浅克隆实现Customer对象复制:

在浅克隆中,被复制对象的所有普通成员变量都具有与原来对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。也就是说,浅克隆仅仅复制所考虑的对象,不会复制它所引用的成员对象。类图与对应的Java代码如下:

图1 使用浅克隆实现Customer对象复制的模式结构图

 

为了获取对象的一份拷贝,我们可以利用Object类的clone()方法,步骤如下:(1)在派生类中覆盖基类的clone()方法,并声明为public;(2)在派生类的clone方法中,调用super.clone();(3)在派生类中实现Cloneable接口,具体代码实现如下(Java):

地址类(Address):

public class Address {
    private String country;
    private String province;
    private String city;
    public String getCountry() {
        return country;
    }
    public void setCountry(String country) {
        this.country = country;
    }
    public String getProvince() {
        return province;
    }
    public void setProvince(String province) {
        this.province = province;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    
    public Address(String country, String province, String city) {
        super();
        this.country = country;
        this.province = province;
        this.city = city;
    }
    @Override
    public String toString() {
        return "Address
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

璩明哲

您的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值