代码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、想解耦框架与生成的实例时