最近看一个项目的源代码,里面的很多代码都不是很懂,原来是因为不理解代码中的设计模式,在一些大神的博客中,学习一一些设计模式的知识,现把学习的内容记录下来。
单例模式
单例模式是常用的设计模式,在java 应用中,能保证在一个JVM中,该对象只有一个实例存在,这样的设计有几个好处:
1.当某些类创造的比较频繁,对于大量这样的对象,对系统的内存是一笔很大的开销。
2.省去了new 操作符,降低了系统内存的使用频率,减轻了GC压力。
public class Singleton {
//1.将构造方法私有化,不允许外部直接创建对象
private Singleton() {
}
//2.创建类的唯一实例
private static Singleton singleton = null;
//3.提供一个用于获取实例的方法
public static Singleton getInstance() {
if(singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
工厂方法模式(Factory Method)
工厂方法模式是类的创建模式,又叫虚拟构造子模式,或者多态性工厂模式,工厂方法模式的用意是定义一个创建产品对象的工厂接口,讲实际创建工作推迟到子类中。
代码示例:
1.创建一个二者的共同接口
public interface Sender {
public void Send();
}
2.创建两个实现类
public class MailSender implements Sender {
@Override
public void Send() {
System.out.println("this is mail sender!");
}
}
public class SmsSender implements Sender {
@Override
public void Send() {
System.out.println("this is sms sender!");
}
}
3.创建两个工厂类
public class SendFactory {
public Sender produce(String type) {
if ("mail".equals(type)) {
return new MailSender();
} else if ("sms".equals(type)) {
return new SmsSender();
} else {
System.out.println("请输入正确的类型!");
return null;
}
}
}
测试代码:
public class Test {
public static void main(String[] args) {
Provider provider = new SendMailFactory();
Sender sender = provider.produce("sms");
sender.Send();
}
}
抽象工厂模式
抽象工厂模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了开闭原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
代码示例:
1.创建一个二者共同接口
public interface Sender {
public void Send();
}
2.创建两个实现类
public class MailSender implements Sender {
@Override
public void Send() {
System.out.println("this is mail sender!");
}
}
public class SmsSender implements Sender {
@Override
public void Send() {
System.out.println("this is sms sender!");
}
}
3.创建两个工厂类
public class SendMailFactory implements Provider {
@Override
public Sender produce() {
return new MailSender();
}
}
public class SendSmsFactory implements Provider {
@Override
public Sender produce() {
return new SmsSender();
}
}
4.创建一个提供接口
public interface Provider {
public Sender produce();
}
测试代码:
“`
public class Test {
public static void main(String[] args) {
Provider provider = new SendMailFactory();
Sender sender = provider.produce();
sender.Send();
}
}“`
这里如果要扩展的话,只需要写一个实现类,实现Sender接口,再写一个工厂类,实现Provider接口就可以了,不用修改原有的代码,符合开闭原则。