设计模式之原型模式

概要

设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美。

定义

用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象

使用场景

1.类初始化需要非常多的资源,非常的耗时间
2.通过new产生非常复杂的数据准备或者访问的权限
3.一个对象需要提供给多个调用者使用,并且可能修改其值

UML

这里写图片描述

上里面的类图很简单,我就做一个简单的介绍

1.IPrototype

定义的原型接口,里面就一个方法,那就是克隆

2.ConcretePrototype

具体的对象,实现了接口IPrototype

代码演示

上面我们已经很清晰的明白了他们之间的关系,所以接下来就用代码演示,将上面我们的想法和逻辑用代码表现出来:

(1)定义接口

package com.zengtao.demo.clone;

/**
 * 接口-clones
 */
public interface IPrototype {

    public MusicPrototype clones();

}

(2)具体对象

package com.zengtao.demo.clone;

import java.util.ArrayList;
import java.util.List;

/**
 * 音乐
 */
public class MusicPrototype implements IPrototype, Cloneable {

    private String title;
    private List<String> voliceList = new ArrayList<String>();
    private List<String> lyricsList = new ArrayList<String>();
    private List<String> imageList = new ArrayList<String>();

    public void addVolice(String content) {
        voliceList.add(content);
    }

    public void addLyrics(String content) {
        lyricsList.add(content);
    }

    public void addImage(String content) {
        imageList.add(content);
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getTitle() {
        return title;
    }

    public void show() {
        System.out.println("歌曲名:" + title);
        System.out.println();
        System.out.println("歌词如下:");
        for (int i = 0; i < lyricsList.size(); i++) {
            System.out.println(lyricsList.get(i).toString());
        }
        System.out.println();
        System.out.println("音乐如下:");
        for (int i = 0; i < voliceList.size(); i++) {
            System.out.println(voliceList.get(i).toString());
        }
        System.out.println();
        System.out.println("图片如下:");
        for (int i = 0; i < imageList.size(); i++) {
            System.out.println(imageList.get(i).toString());
        }
    }

    @Override
    public MusicPrototype clones() {
        MusicPrototype musicPrototype = null;
        try {
            musicPrototype = (MusicPrototype) super.clone();
            musicPrototype.title = this.title;
            musicPrototype.imageList = this.imageList;
            musicPrototype.voliceList = this.voliceList;
            musicPrototype.lyricsList = this.lyricsList;
        } catch (Exception e) {
            // do nothting
        }
        return musicPrototype;
    }

}

(3)调用

package com.zengtao.demo;

import com.zengtao.demo.clone.MusicPrototype;

public class Main {

    public static void main(String[] str) {

        System.out.println("----------------music start------------");
        MusicPrototype musicPrototype = new MusicPrototype();
        musicPrototype.setTitle("中国人");
        musicPrototype.addLyrics("遥远的东方有一条江");
        musicPrototype.addLyrics("它的名字就叫长江");
        musicPrototype.addLyrics("遥远的东方有一条河");
        musicPrototype.addLyrics("它的名字就叫黄河");

        musicPrototype.addVolice("音乐1段");
        musicPrototype.addVolice("音乐2段");

        musicPrototype.addImage("图片1");
        musicPrototype.addImage("图片2");

        musicPrototype.show();
        System.out.println("----------------music end------------");
        System.out.println();

        System.out.println("----------------new music start--------------");
        MusicPrototype musicPrototype2 = musicPrototype.clones();
        musicPrototype2.setTitle("龙的传人");
        musicPrototype.addLyrics("古老的东方有一条龙");
        musicPrototype.addLyrics("它的名字就叫中国");
        musicPrototype.addLyrics("古老的东方有一群人");
        musicPrototype.addLyrics("他们全都是龙的传人");

        musicPrototype2.addVolice("音乐3段");
        musicPrototype2.addImage("图片3");
        musicPrototype2.show();
        System.out.println("----------------new music end--------------");
    }
}

(4)结果

这里写图片描述

大家可以看到,实现的例子非常的简单,但是有一点大家要非常的注意

注意点:
1.创建对象的时候,需要很耗时间
2.创建的对象,有多个调用者去操作他或者更改值

举个简单的例子,比如我们录取歌曲的时候,这首歌曲唱完了,对吧,但是我想改变里面的歌词,自定义添加一个mv的画风等

总结

原型模式,在实际过程中使用到的,不是很常见,上面也讲解过了,什么场景下才使用它,至于其它的,大家只需要谨记一点就够了

有些时候使用clone对象,不一定比new对象来的更快,或许更消耗资源,使用者请谨慎后使用。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值