Java设计模式(一)普通工场模式 抽象工场模式
来源:互联网 发布:淘宝订单不能提前收款 编辑:程序博客网 时间:2024/06/11 14:48
设计模式
设计模式是前人总结的,为了解决一类问题而总结的代码设计经验。最初可能为了使用而使用,后面就会发现,很多没想到的问题因为使用了正确的设计模式已经为你考虑到了。《design patterns设计模式》这本书是程序员进阶必学。
(一)工厂模式
工厂模式的意义在于定义一个用于创建对象的接口,并控制返回哪个类的实例。网上比较流行的一个普通工厂模式的例子。
interface Sender{public void send();}class MainSender implements Sender{public void send (){System.out.println("MainSender");}}class SnsSender implements Sender{public void send(){System.out.println("SnsSender");}}class SendFactory{public Sender product(String type){if("Main".equals(type)){return new MainSender();}else if("Sns".equals(type)){return new SnsSender();}else{System.out.println("请输入正确类型");return null;}}}public class Factory {public static void main(String[] args){SendFactory factory = new SendFactory();Sender sender = factory.product("Main");sender.send();}}但是个人感觉这个没啥用处。在《java设计模式》中对于工厂模式的定义感觉比较好,工厂模式使得客户端代码无须关心使用哪个类的实例,但是上面的例子需要调用者决定返回哪个类的实例。工厂模式不仅要求有一个能够创建新对象的方法,还要让客户代码无须了解具体实例化的类。返回的相同的抽象类型,但实际实例化了不同的类,由哪个类实例化取决于工厂对象接收创建请求时的行为。所以我的理解是,工厂模式的意图是让服务的提供者确定实例化哪个类,而不是客户代码。修改下上面的代码。
interface Sender{public void send();}class MainSender implements Sender{public void send (){System.out.println("MainSender");}}class SnsSender implements Sender{public void send(){System.out.println("SnsSender");}}class SendFactory{public int day = 0;public SendFactory(){day = Calendar.getInstance().get(Calendar.DAY_OF_YEAR);}public Sender product(){if(day%2 == 0){return new MainSender();}else{return new SnsSender();}}}public class Factory {public static void main(String[] args){SendFactory factory = new SendFactory();Sender sender = factory.product();sender.send();}}(二)抽象工厂模式
抽象工厂相比于上面的工厂模式,多了一个抽象接口就是,上面的工厂类是无法扩展的,如果要扩展必须修改工厂类,违背闭包原则。如果将工厂也抽象出来就是一个抽象工厂模式,需要扩展时候直接扩展一个新的工厂。
优点:1、封装性好,产品实现类高层模块不关系,只要找到合适的工厂类。2、产品族内约束为非公开。
缺点:扩展困难,添加一个新工厂,并且新工厂需要一个新接口,那么需要修改抽象类接口,而且前面的每个工厂也要相应的修改。所以对于抽象工厂模式横向扩展简单,纵向扩展困难。在使用的时候可以注意。
interface Sender{public void send();}interface Provider{public Sender product();}class MainSender implements Sender{public void send (){System.out.println("MainSender");}}class SnsSender implements Sender{public void send(){System.out.println("SnsSender");}}class SendMainFactory implements Provider{public int day = 0;public SendMainFactory(){day = Calendar.getInstance().get(Calendar.DAY_OF_YEAR);}public Sender product(){if(day%2 == 0){return new MainSender();}return null;}}class SendSnsFactory implements Provider{public int day = 0;public SendSnsFactory(){day = Calendar.getInstance().get(Calendar.DAY_OF_YEAR);}public Sender product(){if(day%2 == 0){return new SnsSender();}return null;}}public class Factory {public static void main(String[] args){Provider factory = new SendSnsFactory();Sender sender = factory.product();sender.send();}}上面的例子,如果增加一个新工厂只要新建一个工厂继承Provider ,扩展很简单,但是如果需要增加Provider的接口,那么
SendMainFactory
SendSnsFactory也要相应修改。
2 0
- Java设计模式(一)普通工场模式 抽象工场模式
- 设计模式---抽象工场模式
- 设计模式-工场模式
- 设计模式 一 简单工场模式
- 【设计模式】工场模式 || 抽象工厂 || 观察者模式 || 代理模式
- 工场模式
- 工场模式
- 设计模式---简单工场模式
- 设计模式---工场方法模式
- 设计模式-简单工场模式
- Java 设计模式——工场模式(Factory method)
- 工场设计模式和抽象工厂设计模式
- 简单工场、工场方法、抽象工厂模式浅析
- Java设计模式 工场模式 从共享单车说起
- IOS设计模式之工场模式
- android设计模式--简单工场模式
- C# 设计模式-工场方法模式
- 工场模式实现代码
- git在eclipse中的配置和使用
- 微信公众平台改版内容
- android 学习2
- 程序员戒烟有何难?
- jquery dialog buttons 居中
- Java设计模式(一)普通工场模式 抽象工场模式
- Python 文件目录操作
- unable to find valid certification path to requested target 的简单解决办法
- android 学习3
- 那些年我们面试过的单链表算法总结(二)
- 将西方形式的日期字符串转换成java.util.Date对象
- 2014年中国移动互联网用户行为分析
- android 学习4
- js判断是否是移动端自动跳转到wap页面代码