java-设计模式(创建型)
1.工厂方法模式(FactoryMode)
定义:提供创建对象的接口,方便对象的创建。
1.1 静态工厂方法模式(Static Factory Method Mode)
定义:对于对象的创建,交给工厂类内部的静态方法实现。
使用场景:适用于基类的子类较少时,且基本不会再增加子类时。
坏处,当子类增加时,需要修改工厂类的内部,违背了开闭原则。
基类与子类:
public interface Sender { void send (); } class SenderMail implements Sender { @Override public void send() { // TODO Auto-generated method stub System.out.println("发送邮件。"); } } class SenderSms implements Sender { @Override public void send() { // TODO Auto-generated method stub System.out.println("发送短信。"); } }
静态工厂模式:
//静态工厂模式方法:通过工厂内部的方法产生对象。 //缺点:当基类的子类增加时,需要修改工厂类里的方法。 // 违背了开闭原则(增加接口的扩展,减少内部的修改) class SenderFactory { public static Sender produceMail() { return new SenderMail(); } public static Sender produceSms() { return new SenderSms(); } }
测试:
public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Sender mail=SenderFactory.produceMail(); mail.send(); Sender sms=SenderFactory.produceSms(); sms.send(); } }
运行:
发送邮件。 发送短信。
2.抽象工厂模式(Abstract Factory)
定义:对于对象的创建,交给抽象工厂的子类工厂去实现。
使用场景:当基类的子类增加时,我可以增加对于的工厂子类去创建对象,符合开闭原则。
抽象工厂:
interface SenderFactory { Sender produce(); } class MailSenderFactory implements SenderFactory { @Override public Sender produce() { // TODO Auto-generated method stub return new SenderMail(); } } class SmsSenderFactory implements SenderFactory { @Override public Sender produce() { // TODO Auto-generated method stub return new SenderSms(); } }
测试:
public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Sender mail=new MailSenderFactory().produce(); mail.send(); Sender sms=new SmsSenderFactory().produce(); sms.send(); } }
运行:
发送邮件。 发送短信。
3.单态模式(Singleton)
单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:
1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。
2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。
3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。
饿汉模式:
//单态设计模式:饿汗式 public class Singleton { //私有化静态成员变量 private static Singleton instance=new Singleton(); //私有化构造方法 private Singleton() { } //提供获取单例的方法 public static Singleton getInstance() { return instance; } }
懒汉模式(保证了线程同步)
//懒汉模式 public class Singleton { //私有化实例对象,还没创建,当使用时才创建 private static Singleton instance=null; //私有化构造方法 private Singleton(){ } //提供创建单例的方法 public static Singleton getInstance() { if(instance==null) { syninit(); } return instance; } //确保创建单例时线程安全 public static synchronized void syninit() { //此处防止其他线程进来后,不知道单例是否已创建,因此判断下 if(instance==null) instance=new Singleton(); } }