今天来学习 设计模式之创建型模式
顺便画了张uml 图,方便大家来理解下。
下面是各个模式的代码+简介
工厂方法模式
一般用于需要大量产品创建的时候,比如spring的 BeanFactory 创建了大量的bean实例
public class Factory {
public Sender product(String name){
if("SMS".equals(name)){
return new SmsSender();
}
if("Mail".equals(name)){
return new MailSender();
}
return null;
}
}
public interface Sender {
public void send();
}
public class MailSender implements Sender {
@Override
public void send() {
System.out.println("mail sender");
}
}
public class SmsSender implements Sender {
@Override
public void send() {
System.out.println("sms sender");
}
}
抽象工厂模式
如需扩展生产方式的时候,且不修改工厂类,就采用抽象工程模式。例如dubbo tranport这个模块的扩展
public interface Provider {
Sender product();
}
public class MailFactory implements Provider {
@Override
public Sender product() {
return new MailSender();
}
}
public class SmsFactory implements Provider {
@Override
public Sender product() {
return new SmsSender();
}
}
单例模式
这个很常用,一般全局的配置信息啊或者单独的业务加载模块,或者全局的manager啊。
其实懒汉式和内部类单例 区别不大。 线程安全主要是并发修改的时候存在问题
public class Singleton {
private Singleton(){}
//懒汉模式
// private static Singleton instance=new Singleton();
//
// public static Singleton getInstance(){
// return instance;
// }
//饱汉模式
// private static Singleton instance;
//
// public static Singleton getInstance(){
// if(instance==null){
// instance=new Singleton();
// }
// return instance;
// }
//简单线程安全
// private static Singleton instance;
//
// public static synchronized Singleton getInstance(){
// if(instance==null){
// instance=new Singleton();
// }
// return instance;
// }
//双重检测
// private static Singleton instance;
//
// public static Singleton getInstance(){
// if(instance==null){
// synchronized(Singleton.class){
// if(instance==null){
// instance=new Singleton();
// }
// }
// }
// return instance;
// }
public static class Singleton1{
private static Singleton inSingleton=new Singleton();
}
public static Singleton getInstance(){
return Singleton1.inSingleton;
}
建造者模式
与工厂模式的区别是 建造者模式可以生产多个产品。
public class Builder {
List<Sender> list=new ArrayList<Sender>();
public void build(int count,String name){
for(int i=0;i<count;i++){
if("sms".equals(name)){
list.add(new SmsSender());
}else{
list.add(new MailSender());
}
}
}
}
原型模式
所谓原型模式,就是指clone。 netty在 server传递channel的时候,有使用到。 一般用于 创建复杂的对象,省去初始化。
这里会设计到 深克隆和浅克隆问题。
浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。
深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。
public class Prototype implements Cloneable{
protected Prototype clone() throws CloneNotSupportedException {
return (Prototype)super.clone();
}
}