图解设计模式 -- 生成实例(一)

代码Github连接 :https://github.com/tangbi123/Tab-Design-Pattern

Singleton模式

只能创建一个实例的需求
1、像确保任何情况下都绝对只有1各实例
2、想在程序上表现出“只存在一个实例”

1、示例

在这里插入图片描述

名字说明
Singleton只存在一个实例的类
main测试程序行为的类

Tips:
1、构造函数 private
2、getInstance, 获取唯一实例

代码清单

1)Singleton

public class Singleton {
    private static Singleton singleton = new Singleton();
    private Singleton(){
        System.out.println("生成了一个实例");
    }

    public static Singleton getInstance(){
        return singleton;
    }
}

2)main

public class main {
    public static void main(String[] args) {
        System.out.println("start .");
        Singleton obj1 = Singleton.getInstance();
        Singleton obj2 = Singleton.getInstance();

        if(obj1 == obj2){
            System.out.println("obj1 和 obj2 是相同的实例");
        }
        else{
            System.out.println("obj1 和 obj2 不 是相同的实例");
        }
        System.out.println("end .");
    }
}

2、角色

在这里插入图片描述
(要注意 构造私有化)
Singleton 模式中,只有Singleton这一个角色。
Singleton角色中有一个返回唯一实例的static方法。该方法总是会返回同一个实例。

3、思路要点

1)何时生成唯一实例
示例中是, 程序一运行 就生成了,为懒汉式。
还有一种,需要它时再生成,饿汉式。
可参照 java单例 :https://blog.csdn.net/weixin_44919162/article/details/117020413

Prototype模式

延申阅读

clone方法和 java.lang.Clonable接口

实现java.lang.Clonable接口,可以调用clone方法复制对象。
clone:
1、实现了 Cloneable接口类的实例
-》复制
2、没有实现 Cloneable接口类的实例
-》 发生 CloneNotSupportedException 异常

clone方法是在哪里定义的

clone方法定义在java.lang.Object 中,所有类都继承了clone方法

需要实现Cloneable的那些方法

Cloneable接口中并没有声明任何方法。它只是用来标记“可以使用clone方法进行复制”。
这样的接口被称为 标记接口。

clone方法进行的是浅复制

只是将被复制实例的字段值 直接复制到新的实例中。对于引用类型的变量,也只会复制引用。
需要重写clone方法:
1、当clone方法进行浅复制无法满足需求时
2、对于在生成实例时需要进行特殊的初始化处理的类

不能根据类来生成实例,而要根据现有的实例来生成新的实例:
1)对象种类繁多,无法将他们整合到一个类中
多个类文件
2)难以根据类生成实例
生成实例的过程太过复杂:图形编辑器中使用鼠标制作出的图形的实例。
3)想解耦框架与生成的实例
想要让生成实例的框架不依赖于具体的类。事先“注册”一个“原型”实例,然后通过复制该实例来生成新的实例。

正文:

Prototype模式:根据实例原型、实例模型来生成新的实例。

1、示例

在这里插入图片描述
1)Product接口
Cloneable接口:调用 clone进行实例复制

public interface Product extends Cloneable{
    public abstract void use(String s);
    public abstract Product crateClone();
}

2)Manager类
用 Map来存储 原型

import java.util.HashMap;

public class Manager {
    private HashMap showcase = new HashMap();
    public void register(String name, Product proto){
        showcase.put(name,proto);
    }
    public Product create(String protoname){
        Product p = (Product)showcase.get(protoname);
        return p.crateClone();
    }
}

3)MessageBox类

public class MessageBox implements Product{
    private char decochar;

    public MessageBox(char decochar) {
        this.decochar = decochar;
    }

    @Override
    public void use(String s) {
        int length = s.getBytes(StandardCharsets.UTF_8).length;
        for(int i = 0; i < length + 4; i++)
            System.out.print(decochar);
        System.out.println();
        System.out.println(decochar + " " + s + " " + decochar);

        for(int i = 0; i < length + 4; i++)
            System.out.print(decochar);
        System.out.println();
    }

    /**
     * clone a Product and return it
     * */
    @Override
    public Product crateClone() {
        Product p = null;
        try{
            p = (Product) clone();
        }catch (CloneNotSupportedException e){
            e.printStackTrace();
        }
        return p;
    }
}

4)UnderlinePen类

public class UnderlinePen implements Product{
    private char ulchar;

    public UnderlinePen(char ulchar) {
        this.ulchar = ulchar;
    }


    @Override
    public void use(String s) {
        int length = s.getBytes(StandardCharsets.UTF_8).length;
        System.out.println("\"" + s + "\"");
        System.out.print(" ");
        for(int i = 0; i < length; i++){
            System.out.print(ulchar);
        }
        System.out.println();
    }

    @Override
    public Product crateClone() {
        Product p = null;
        try{
            p = (Product) clone();
        }catch (CloneNotSupportedException e){
            e.printStackTrace();
        }
        return p;
    }
}

5)man类

public class main {
    public static void main(String[] args) {
        Manager manager = new Manager();
        UnderlinePen upen = new UnderlinePen('~');
        MessageBox sBox = new MessageBox('*');
        MessageBox mBox = new MessageBox('/');
        manager.register("upen", upen);
        manager.register("sBox", sBox);
        manager.register("mBox", mBox);

        Product p1 = manager.create("upen");
        p1.use("测试机哦");
        Product p2 = manager.create("sBox");
        p2.use("测试机哦i");
    }
}

2、角色

在这里插入图片描述
1)Prototype(原型) =》 Product
负责定义用于复制现有实例来生成新实例的方法(Cloneable -》 clone())。
2)Client(使用者)=> Manager
负责 使用 复制实例的方法 来生成实例。
3)ConcretePrototype(具体的原型) =》MessageBox、UnderlinePen
负责实现 复制现有实例 并生成新实例的方法。

3、思路要点

1)不能根据类来生成实例吗
1、对象种类繁多,无法将他们整合到一个类中时
2、难以根据类生成实例
3、想解耦框架与生成的实例时

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值