单例模式结合观察者模式

起因:多线程对数据库写操作
办法:让多线程先把数据写到一个公共的arraylist中,等这个list足够大的时候,单开一个线程进行写操作。
方案:
首先,将这个arraylist使用单例模式思想,这样就可以让多线程都用它,并且写一起。
然后,用观察者观察这个arraylist的长度,如果到了指定长度,就进行写操作,同时清空这个arraylist,方便多线程们继续使用。
结果,实现了!!


-----
感谢对此方案提出过宝贵意见的 姜同学,小强同学,大师同学~~~hoho~~排名不分先后~~O(∩_∩)O哈哈~

demo: 让一个循环让单例的arraylist写数字...每当arraylist长度到5的时候,打印arraylist,并且置空。

代码如下:
Singleton.java 单例的类


package testArray;


import java.util.ArrayList;
import java.util.Observable;

public class Singleton extends Observable{

private ArrayList<String> arrayList=new ArrayList<String>();

private static Singleton singleton=null;

/**
* 避免被继承
*/
private Singleton(){

}

/**
* 产生单例
* @return
*/
public static Singleton getInstance(){
if(singleton==null){
singleton=new Singleton();
}
return singleton;
}

/**
* 只要能置空arraylist就行.
*/
public static void clearInstance(){
singleton.arrayList.clear();

}
public void putElement(String str){
arrayList.add(str);
if(arrayList.size()>5){
setChanged(); //触发观察者模式
notifyObservers(arrayList);
}
}



}



DataOperation.java 操作类

package testArray;

import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;

public class DataOperation implements Observer {

private ArrayList<String> arrayList=null;

public void update(Observable o, Object arg) {
if(arg instanceof ArrayList){
arrayList=(ArrayList)arg;
for(String s : arrayList){
System.out.println(s);
}
System.out.println("*********************************");
Singleton.clearInstance();//想在这里让那个单例的list置空
}

}

}



测试类 Test.java

package testArray;

public class Test {

/**
* @param args
*/
public static void main(String[] args) {
Singleton singleton=Singleton.getInstance();
singleton.addObserver(new DataOperation());
int i=0;
while(i<12){
singleton.putElement(i+":ele");
i++;
}


}

}



结果:

0:ele
1:ele
2:ele
3:ele
4:ele
5:ele
*********************************
6:ele
7:ele
8:ele
9:ele
10:ele
11:ele
*********************************

<think>嗯,用户让我介绍一下工厂模式、单例模式观察者模式。这三个都是设计模式里的常见模式,但具体怎么组织呢?首先得确定用户的需求,可能是个刚学编程的新手,或者想复习设计模式的人。需要简单明了地解释每个模式,最好有例子帮助理解。 工厂模式,我记得是创建对象的,但具体分简单工厂、工厂方法、抽象工厂?不过用户可能不需要太深入的分类,先讲基本概念。比如,工厂用来解耦对象的创建使用,比如汽车工厂生产不同车型的例子。然后举一个简单的代码例子,比如Python中的类,用工厂类来创建不同产品对象。 然后是单例模式,确保一个类只有一个实例。需要解释为什么需要单例,比如配置管理、日志记录等场景。可能要注意线程安全,但如果是Python的话,可能用模块级别的实现更简单。例子的话,可以举一个数据库连接的例子,确保全局只有一个连接实例。 观察者模式,处理对象间的一对多依赖关系,当一个对象状态改变时,所有依赖它的对象都得到通知。比如发布-订阅系统,比如天气站显示器的例子。代码部分可以用主题类观察者接口,然后具体观察者实现更新方法。 要检查是否每个模式都涵盖了定义、用途、结构例子。还要确保用中文,避免复杂术语,让新手容易理解。可能需要确认例子的正确性,比如单例模式在Python中的实现方式,是否线程安全,或者是否有其他更好的方法。比如使用装饰器或者元类,但简单例子可能用__new__方法更直观。 另外,用户提到使用LaTeX格式,但用户的问题里没有数学公式,可能不需要。不过按照系统指令,如果有公式的话需要用$...$,但这里可能不需要。不过要确保回答中的技术术语正确,比如类名、方法名用合适的方式标注,比如使用代码块或引号。 结构方面,可能每个模式分一个小节,用标题标出,然后每部分包含定义、用途、结构、例子。但用户要求结构清晰,帮助逐步解决问题,所以可能需要更自然的段落式解释,结合例子说明。 最后检查是否有错误,比如工厂模式的分类是否正确,单例模式的不同实现方式是否适用,观察者模式的例子是否恰当。确保例子代码正确,比如Python中的类定义方法调用是否正确。例如,在观察者模式中,主题类维护观察者列表,有添加、删除通知的方法,观察者实现update方法。 总结下来,需要分三部分,每部分简要介绍模式的定义、解决的问题、结构一个简单的代码示例。使用中文,避免复杂术语,保持简洁明了。</think>三大设计模式解析(附代码示例): 1. 工厂模式(Factory Pattern) √ 作用:解耦对象创建与使用,像"产品生产流水线" √ 场景:需要根据不同条件创建相似对象时 √ 示例:图形绘制工具 ```python class Shape: def draw(self): pass class Circle(Shape): def draw(self): print("绘制圆形") class Rectangle(Shape): def draw(self): print("绘制矩形") class Sh
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值