Java 设计模式学习-单例模式&工厂模式

最近看一个项目的源代码,里面的很多代码都不是很懂,原来是因为不理解代码中的设计模式,在一些大神的博客中,学习一一些设计模式的知识,现把学习的内容记录下来。

单例模式

单例模式是常用的设计模式,在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接口就可以了,不用修改原有的代码,符合开闭原则。

猜你喜欢

转载自blog.csdn.net/duaduo/article/details/79024579