public class EventBus {
private static volatile EventBus defaultInstance;
public static EventBus getDefault() {
if (defaultInstance == null) {
synchronized (EventBus.class) {
if (defaultInstance == null) {
defaultInstance = new EventBus();
}
}
}
return defaultInstance;
}
}
构造方法私有,静态方法得到实例
volatile 关键字:告诉不同的线程 不要拿寄存器的值,要拿主存的值
synchronized 关键字:可以同步与 方法 或者 代码块
用汽车为例子
public abstract class Call{
// 启动 开车
public abstract Start();
}
// 奥迪车类
public AodiCar extends Car{
public void Start(){
system.out.println("奥迪车启动了")
};
}
// 宝马车类
public BWMCar extends Car{
public void Start(){
system.out.println("宝马车启动了")
};
}
public class CarFactory{
//此处传递过来的参数是 包.类名
public static Car getInstance(Class clazz) {
Car car = null;
try {
//利用反射 实例化对象
car = (Car)Class.forName(clazz.getName).newInstance();
}catch(Exception e) {
e.printStackTrace();
}
return car;
}
}
Car aodiCar= CarFactory.getInstance(AodiCar.class)
Car bmwCar= CarFactory.getInstance(BWMCar.class)
aodiCar.start();
bmwCar.start();
比如Retrfit中有很多个Service 你完全可以用工厂模式做
public interface Observerable{
// 用来注册观察者 也就是注册用户
void register(Observe o);
// 移除观察者 也就是移除用户
void unRegister(Observe o)
//通知 也就是发送推广广告
void notifyAll();
}
public interface Observe{
// 收到消息 也就是收到银行的广告通知
void recivered(String msg);
}
public class ObserverableImpl implements ObserveAble{
// 这个是存贮所有注册过的观察者
private ArrayList list;
// 记录要下发的消息
private String message;
public ObserverableImpl(){
list = new ArrayList();
}
// 添加
@Override
public void register(Observe o){
if(!list.contains(o)){
list.add(o);
}
}
//移除
@Override
public void unRegister(Observe o){
if(list.contains(o)){
list.remove(o);
}
}
//通知
@Override
public void notifyAll(){
for(int i=0;i++;i
public class ObserveImpl(){
private String name;
public ObserveImpl(String name){
this.name=name;
}
@Override
public void recivered(String msg){
//收到消息 去做自己的事情
System.out.println(name + " 收到推送过来的消息: " + message);
}
}
// 银行
Observerable obserebale = new ObserverableImpl();
//用户
Observer xiaoming = new ObserveImpl("小明");
Observer xiaohong = new ObserveImpl("小红");
obserebale.register(userZhang);
obserebale.register(userLi);
// 调用Observerable的发送消息
obserebale.setInfomation("你中奖100w");
打印的日志是:
小明收到推送的消息你中奖100w
小红收到推送的消息你中奖100w
public class Person {
private String mName;
private int mAge;
private String mAddress;
private Person(Builder builder) {
mName = builder.mName;
mAge = builder.mAge;
mAddress = builder.mAddress;
}
public static final class Builder {
private String mName;
private int mAge;
private String mAddress;
public Builder() {
}
public Builder setName(String name) {
mName = name;
return this;
}
public Builder setAge(int age) {
mAge = age;
return this;
}
public Builder setAddress(String address) {
mAddress = address;
return this;
}
public Person build() {
return new Person(this);
}
}
}
Person person = new Person.Builder().setAddress("河北邯郸").setName("nzy").setAge(27).build();
他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。
android中的hook技术,有些插件化技术,spring中通过动态代理实现了aop(切面编程),retrofit.create
public interface ApiService
{
@GET("/heiheihei")
public void add(int a, int b);
}
}
class MyInvocationHandler implements InvocationHandler{
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Integer a = (Integer) args[0];
Integer b = (Integer) args[1];
System.out.println("方法名:" + method.getName());
System.out.println("参数:" + a + " , " + b);
GET get = method.getAnnotation(GET.class);
System.out.println("注解:" + get.value());
return null;
}
}
ApiService service = (ApiService) Proxy.newProxyInstance(ApiService.class.getClassLoader(), new Class>[]{ITest.class},new MyInvocationHandler())
动态地为一个对象添加一些额外的职责,若要扩展一个对象的功能,装饰者提供了比继承更有弹性的替代方案。
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("..")));