java23种设计模式.(借鉴他人)
总体来说设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
逐步分析:
1.普通工厂模式:
发送接口:
public interface Sender { public void send(); }
两个实现接口的类:
public class MailSend implements Sender{ @Override public void send() { System.out.println("发送邮件!"); } }
public class SmsSend implements Sender { @Override public void send() { System.out.println("发送短信!"); } }
工厂方法:
public class SendFactory { public Sender produce(String type) { if ("mail".equals(type)) { return new MailSend(); } else if ("sms".equals(type)) { return new SmsSend(); } else { System.out.println("请检查类型"); return null; } } }
测试方法:
public class Test001 { @Test public void test001() { SendFactory factory = new SendFactory(); Sender produce = factory.produce("mail"); Sender produce2 = factory.produce("sms"); System.out.println(produce); System.out.println(produce2); } }
运行结果:
fz.song.sjms.ms001.MailSend@442c8ab0
fz.song.sjms.ms001.SmsSend@48454bc7
分析:可以创建不同的对象,但是如果字符串错了则不能创建对象.
2:多个工厂方法模式
与第一个方法区别在于工厂方法:
public class SendFactory { public Sender produceMailSend() { return new MailSend(); } public Sender produceSmsSend() { return new SmsSend(); } }
测试:
public void test001() { SendFactory factory = new SendFactory(); Sender produce = factory.produceMailSend(); Sender produce2 = factory.produceSmsSend(); System.out.println(produce); System.out.println(produce2); }
运行结果:
fz.song.sjms.ms002.MailSend@442c8ab0
fz.song.sjms.ms002.SmsSend@48454bc7
分析:经过这个修改,不存在传值的问题了.
3:静态工厂方法模式
修改工厂方法:
public class SendFactory { public static Sender produceMailSend() { return new MailSend(); } public static Sender produceSmsSend() { return new SmsSend(); } }
测试方法:
public class Test001 { @Test public void test001() { Sender produce = SendFactory.produceMailSend(); Sender produce2 = SendFactory.produceSmsSend(); System.out.println(produce); System.out.println(produce2); } }
运行结果:
fz.song.sjms.ms003.MailSend@3124805
fz.song.sjms.ms003.SmsSend@253641d6
分析:不需要新建对象,直接使用类加载方法,123相比之下,3比较常用.但是在扩展功能的时候,必将要修改以前的代码,这个是不好的.所以我们要思考,怎么去做才能在不改动源码的情况下,扩展我们的程序.于是就有了抽象工厂方法模式.
4:抽象工厂方法模式
解决方案,我们创建多个工厂类,一旦需要增加新的功能,直接增加工厂类就好了
代码:
接口
public interface Sender { public void send(); }
连个实现类:
public class MailSend implements Sender{ @Override public void send() { System.out.println("发送邮件!"); } }
public class SmsSend implements Sender { @Override public void send() { System.out.println("发送短信!"); } }
工厂方法的接口:
public interface Provider { public Sender getSend(); }
工厂方法的实现类:
public class MailSendFactory implements Provider { @Override public Sender getSend() { return new MailSend(); } }
public class SmsSendFactory implements Provider{ @Override public Sender getSend() { return new SmsSend(); } }
测试类:
public class Test001 { @Test public void test001() { Provider provider = new MailSendFactory(); Sender send = provider.getSend(); Provider provider2 = new SmsSendFactory(); Sender send2 = provider2.getSend(); System.out.println(send); System.out.println(send2); } }
运行结果:
fz.song.sjms.ms003.MailSend@65c461d7
fz.song.sjms.ms003.SmsSend@53839d2e
分析:添加新的功能只需要实现功能接口和工厂方法的接口,就可以添加新的功能,不需要改动以前的代码.
例如:添加发送微信
添加实现类:
public class WeiXInSend implements Sender{ @Override public void send() { System.out.println("发送微信"); } }
添加工厂方法的实现类:
public class WeixinSendFactory implements Provider { @Override public Sender getSend() { return new WeiXInSend(); } }
测试方法:
public class Test001 { @Test public void test001() { Provider provider = new MailSendFactory(); Sender send = provider.getSend(); Provider provider2 = new SmsSendFactory(); Sender send2 = provider2.getSend(); System.out.println(send); System.out.println(send2); Provider provider3=new WeixinSendFactory(); Sender send3 = provider3.getSend(); System.out.println(send3); } }
运行结果:
fz.song.sjms.ms003.MailSend@1c093b3c
fz.song.sjms.ms003.SmsSend@220fee85
fz.song.sjms.ms003.WeiXInSend@5bf24008
分析:添加新的功能只要添加相应的方法和工厂方法就可以了,不用修改原代码.利于扩展.