1、工厂设计模式: 凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。 共同的代码: public interface Sender { void send(); } public class MailSender implements Sender { @Override public void send() { System.out.println("MailSender发送send方法"); } } public class SmsSender implements Sender { @Override public void send() { System.out.println("Sms"); } } 普通工厂模式: public class SendFactory_Factory_Normal { 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 NormalUI { public static void main(String[] args) { SendFactory_Factory_Normal sendFactory = new SendFactory_Factory_Normal(); Sender sender = sendFactory.produce("sms"); sender.send(); } } 多个工厂方法模式: public class Factory_more { public Sender prodeceMail() { return new MailSender(); } public Sender produceSms() { return new SmsSender(); } } /** * 是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错, * 则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。 */ public class MoreUI { public static void main(String[] args) { Factory_more more = new Factory_more(); Sender sender = more.prodeceMail(); sender.send(); } } 静态工厂模式: public class SendFactory_Static { public static Sender produceMail() { return new MailSender(); } public static Sender produceSms() { return new SmsSender(); } } /** * 将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。 */ public class StaticUI { public static void main(String[] args) { Sender sender = SendFactory_Static.produceMail(); sender.send(); } } 总结:在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。 缺点: 工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决? 就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接 增加新的工厂类就可以了,不需要修改之前的代码。 其实这个模式的好处就是,如果你现在想增加一个功能:发及时信息,则只需做一个实现类, 实现Sender接口,同时做一个工厂类,实现Provider接口,就OK了,无需去改动现成的代码。这样做,拓展性较好! 抽象工厂模式: public interface Provider { public Sender produce(); } public class SendMailFactory implements Provider { @Override public Sender produce() { return new MailSender(); } } public class SendSmsFactory implements Provider { @Override public Sender produce() { return new SmsSender(); } } public class AbstractUI { public static void main(String[] args) { Provider provider = new SendMailFactory(); Sender sender = provider.produce(); sender.send(); } } 拓展: public class SendPhoneFactory implements Provider { @Override public Sender produce() { return new PhoneSender(); } } public class PhoneSender implements Sender { @Override public void send() { System.out.println("phone"); } } public class AbstractUI { public static void main(String[] args) { Provider factory = new SendPhoneFactory(); Sender sender = factory.produce(); sender.send(); } }
相关推荐
C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计...
设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代 码可靠性。...本资源使用C++实现了23种设计模式的经典案例。
23种设计模式23种设计模式23种设计模式23种设计模式
设计模式精解- GoF 23种设计模式解析附C++实现源码 懂了设计模式,你就懂了面向对象分析和设计(OOA/D)的精要。反之好像也可能成立。道可道,非常道。道不远人,设计模式亦然如此。 一直想把自己的学习经验以及在...
就像在一年前看GoF的《设计模式》一书,和半年前用C++模拟、实现23种经典的设计模式一般,透过这个写解析的过程,我又看到了另外一个境界。一直认为学习的过程很多时候可以这样划分:自己学会一门知识(技术)、表达...
23种设计模式UML类图,以及相应的源码,文档,自己找过的,查阅过的网上的资料
23种设计模式整理pdf
java23种设计模式+23个实例demo: 关于代码的几点说明: 1. 代码为根据个人对Design Pattern的学习理解写出, 2. 每个Pattern均是一个目录,其目录名即是Pattern的名字, 所有代码用JDeveloper 9i 和JBuilder 6.0编写...
用Java实现的23种设计模式,完整的代码,本想无积分下载来着,后来一想还是设置点儿把,毕竟我不喜欢不劳而获的思想,希望每个TX在下载别人的资源的同时,也积极上传资源与他人一起分享!
设计模式精解-GoF23种设计模式解析(附C++实现源码)
java23种设计模式详解附带所有代码实现,适合初学者,请点个赞,谢谢
23种设计模式(创建型,结构型,行为型)23种设计模式(创建型,结构型,行为型)23种设计模式(创建型,结构型,行为型)
23种设计模式(C++)
.NET23种设计模式【完整】
设计模式精解,GoF 23种设计模式解析附C++实现源码 ,当工具书用,设计模式是程序开发的兵法。
设计模式精解-GoF23种设计模式解析附C++实现源码,是系统学习设计模式,深入理解每种模式的原型,优缺点,适用的场景,达到灵活运用目的的最好参考书
设计模式精解-GoF-23种设计模式解析--附C++源代码,帮助理解!