首页 文章 精选 留言 我的

精选列表

搜索[java],共10000篇文章
优秀的个人博客,低调大师

JAVA中的设计模式二(工厂模式)

工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类。 工厂模式主要有: 简单工厂模式,工厂方法,抽象工厂; 简单工厂: 又叫静态工厂,是工厂模式三中状态中结构最为简单的。主要有一个静态方法,用来接受参数,并根据参数来决定返回实现同一接口的不同类的实例。我们来看一个具体的例子: 如下面价单的图形 代码如下:首先我们先创建一个抽象的产品: 1 package Factory; 2 3 public abstract class BMW { 4 5 public BMW() { 6 } 7 8 } 然后我们具体的产品类去继承我们的抽象产品: 1 public class BMW320 extends BMW{ 2 public BMW320() { 3 // TODO Auto-generated constructor stub 4 System.out.println("生产BMW320"); 5 } 6 } 7 8 9 10 11 12 public class BMW523 extends BMW{ 13 public BMW523() { 14 // TODO Auto-generated constructor stub 15 System.out.println("生产BMW523"); 16 } 17 } 下面我们创建我们的工厂: 1 package Factory; 2 3 public class Factory { 4 public BMW crateBMW(int type){ 5 if(type==320){ 6 return new BMW320(); 7 }else if (type==523){ 8 return new BMW523(); 9 }else{ 10 return null; 11 } 12 } 13 } 下面就是客户了,客户需要产品,我们进行生产: 1 package Factory; 2 3 public class Customer { 4 public static void main(String[] args) { 5 Factory f=new Factory(); 6 BMW b320=f.crateBMW(320); 7 BMW b523=f.crateBMW(523); 8 } 9 } 运行的结果如下-----: 这个就是简单的工厂模式; 上面的代码告诉我们,简单工厂并不简单,它是整个模式的核心,一旦他出了问题,整个模式都将受影响而不能工作,为了降低风险和为日后的维护、扩展做准备,我们需要对它进行重构,引入工厂方法。 工厂方法: 工厂方法其实就是,不同额工厂对应不同的产品,就算其中某一个工厂不能正常工作了,也不会影响到其他的工厂工作; 首先我们先创建 产品接口和对应的具体产品 1 public interface Product { 2 3 } 4 5 6 public class Washer implements Product{ 7 8 public Washer() { 9 System.out.println("洗衣机被制造了"); 10 } 11 12 } 13 14 15 16 public class AirCondition implements Product{ 17 18 public AirCondition() { 19 System.out.println("空调被制造了"); 20 } 21 } 然后我们再创建 工厂接口和对应的具体生产不同商品的工厂 public interface Factory { } public class WasherFactory implements Factory{ public Product make(){ return new Washer(); } } public class AirConditionFactory implements Factory{ public Product make(){ return new AirCondition(); } } 最后就是顾客了, 1 package Factory2; 2 3 public class Customer { 4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 8 WasherFactory f=new WasherFactory(); 9 Product w=f.make(); 10 11 AirConditionFactory f2=new AirConditionFactory(); 12 Product w2=f2.make(); 13 } 14 } 运行的结果为: 可以理解为:有了很多个工厂方法,自己需要哪一个产品,就调用当前产品的工厂方法,获取相应的具体实例。 从上面创建产品对象的代码可以看出,工厂方法和简单工厂的主要区别是,简单工厂是把创建产品的职能都放在一个类里面,而工厂方法则把不同的产品放在实现了工厂接口的不同工厂类里面,这样就算其中一个工厂类出了问题,其他工厂类也能正常工作,互相不受影响,以后增加新产品,也只需要新增一个实现工厂接口工厂类,就能达到,不用修改已有的代码。但工厂方法也有他局限的地方,那就是当面对的产品有复杂的等级结构的时候,例如,工厂除了生产家电外产品,还生产手机产品,这样一来家电是手机就是两大产品家族了,这两大家族下面包含了数量众多的产品,每个产品又有多个型号,这样就形成了一个复杂的产品树了。如果用工厂方法来设计这个产品家族系统,就必须为每个型号的产品创建一个对应的工厂类,当有数百种甚至上千种产品的时候,也必须要有对应的上百成千个工厂类,这就出现了传说的类爆炸,对于以后的维护来说,简直就是一场灾难..... 抽象方法: 抽象工厂:意的意图在于创建一系列互相关联或互相依赖的对象。我自己觉得抽象工厂是在工厂方法的基础上引进了分类管理的概念....工厂方法用来创建一个产品,它没有分类的概念,而抽象工厂则用于创建一系列产品,所以产品分类成了抽象工厂的重点,我们继续用上面的例子来说明:工厂生产的所有产品都用都用大写字母来标明它们的型号,比如冰箱,就有“冰箱-A",“冰箱-B",同样,其他的产品也都是遵守这个编号规则,于是就有了一下产品家族树 首先:我们创造不同的 电视和鼠标的接口: 1 public interface TV { 2 } 3 4 5 public interface Mouse { 6 7 } 然后我们创造冰箱和鼠标的不同的品种: 1 public class TV_A implements TV{ 2 3 public TV_A() { 4 System.out.println("A型TV"); 5 } 6 7 } 8 9 10 public class TV_B implements TV{ 11 12 public TV_B() { 13 System.out.println("B型TV"); 14 } 15 16 } 17 18 19 public class Mouse_A implements Mouse{ 20 21 public Mouse_A() { 22 System.out.println("A型鼠标"); 23 } 24 25 } 26 27 28 public class Mouse_B implements Mouse{ 29 30 public Mouse_B() { 31 System.out.println("B型鼠标"); 32 } 33 34 } 最后就等到了不同类型的工厂,生产不同类型的产品。如A工厂只生产A类型的产品 public class Factory_A implements Factory{ @Override public TV createTv() { // TODO Auto-generated method stub return new TV_A(); } @Override public Mouse createMouse() { // TODO Auto-generated method stub return new Mouse_A(); } } public class Factory_B implements Factory{ @Override public TV createTv() { // TODO Auto-generated method stub return new TV_B(); } @Override public Mouse createMouse() { // TODO Auto-generated method stub return new Mouse_B(); } } 最后就是测试类: 1 package Foctory3; 2 3 public class Customer { 4 public static void main(String[] args) { 5 Factory f=new Factory_A(); 6 f.createTv(); 7 f.createMouse(); 8 9 f=new Factory_B(); 10 f.createTv(); 11 f.createMouse(); 12 } 13 } 运行结果如图所示: 欢迎大家一起说出自己的想法。

优秀的个人博客,低调大师

大型网站架构之JAVA中间件

中间件就是在大型网站中,帮助各子模块间实现互相访问,消息共享或统一访问等功能的软件产品。常见的有: 远程服务框架中间件:主要解决各子模块之间互相访问的问题。 消息队列中间件:主要解决各子模之间消息共享的问题。 数据访问中间件:用于简化应用层对数据层的访问。 关于远程服务框架中间件,国内目前较多应用的是阿里巴巴的开源分布式服务框架Dubbo。其原理如图: 消息队列中间件是一种EDA架构(event driven architecture):通过在低耦合的模块之间传输事件消息来完成模块之间的合作。大型网站中,消息队列采用发布/订阅模式。消息发布者发布消息到消息队列,消息消费者只要对该类消息感兴趣,就可以订阅该消息,对其他的业务没有任何的影响。其原理如图: 目前常用的消息队列产品为Apache的ActiveMQ。 分布式服务框架和分布式消息队列是系统模块化之后主要的2种聚合方式。 对于数据访问中间件,在此不做介绍。 本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/6293163.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

基于Java技术的大型网站架构方案

Web层 主体架构可以基于 Struts 1.X/2.X,当然有很多更好的控制层框架供选择,以快速敏捷为准则吧。 抽象出核心库封装 控制器和中间层 的操作。 在大规模集群环境下,session复制会引起严重的性能问题。考虑用 集群缓存 + cookie验证 代替session实现权限控制吧。 Cache层 配置 Memcache 组成集群缓存 对 Memcache 客户端进行封装 Memcached 节点组成池,调用示意:opList (BizName, 策略 ...) 中间层 “中间层”可以理解为基于应用和数据之间的层次。它被设计用来为Web应用提供:数据缓存 和 对应用透明的数据访问——即应用不需要考虑数据表拆分的问题。以服务的方式提供对存储层的高性能调用以及分布式计算。可供选择的框架: ICE Hadoop 直接基于Memcache开发(减少复杂度,推荐) 存储 推荐MySQL,理由:免费,经过实践检验,有大量成熟的案例、解决方案、技术支持。 小规模:一个 data table 维护存储服务器阵列,内容 -> mount …… 大规模:Master-Slave模式+MySQL Proxy,实现数据库读写分离。在中间层的包装下,可做如下扩展,以支持更大规模的数据存取: 数据库/表水平拆分,例 User -> User33% + User33% + User34% 数据库/表垂直拆分,例 User -> UserBaseInfo + UserAddrInfo 也可考虑使用 LongStore (龙存) 解决方案,由龙存管理存储阵列…… 部署 划分子域名,每个子域名一个Web应用包,互不干扰 静态资源(css, js, image ...)使用专门的静态服务器 负载均衡 小规模:DNS轮询。 大规模:F5, 2*X 台F5服务器,F5是L4/L7层交换机,每台至少可处理200万连接(与服务器内存有关)。 Ngnix是L7层交换,LVS负载均衡也是一种方案 Web中间件选择 Tomcat - 最高400并发 Apache - 最高2000并发 Ngnix - 优于Apache 采用方案:Ngnix + Resin ,理由: Resin提供更为快速的servlet引擎 - 选择Resin。 gzip问题 - Resin在单独处理gzip时存在内存溢出的隐患,因此要加一层 Ngnix。 Ngnix 能减少单独使用Resin时的内存占用 - Resin建立1000个连接使用1000个线程;加Ngnix后,透过其“异步连接”、“建立长连接”机制使Resin内存压力大大减小。 Ngnix 针对Linux系统有性能优化措施 - 0 Copy, send file ... 因此采用:1 Ngnix + 1 Resin,一对一。 静态服务器采用:Squid + Apache, why? because Squid has cache ability ... 新变化 - Nginx从0.7.48版本开始,支持了类似Squid的缓存功能。这个缓存是把URL及相关组合当作Key,用md5编码哈希后保存在硬盘上,所以它可以支持任意URL链接,同时也支持 404/301/302 这样的非200状态码。虽然目前官方的Nginx Web缓存服务只能为指定URL或状态码设置过期时间,不支持类似Squid的PURGE指令,手动清除指定缓存页面,但是,通过一个第三方的Nginx模块,可以清除指定URL的缓存。 Nginx的Web缓存服务主要由proxy_cache相关指令集和fastcgi_cache相关指令集构成,前者用于反向代理时,对后端内容源服务器进行缓存,后者主要用于对FastCGI的动态程序进行缓存。两者的功能基本上一样。 最新的Nginx 0.8.31版本,proxy_cache和fastcgi_cache已经比较完善,加上第三方的ngx_cache_purge模块(用于清除指定URL的缓存),已经可以完全取代Squid。有的网站已经在生产环境使用了 Nginx 的 proxy_cache 缓存功能超过两个月,十分稳定,速度不逊于 Squid。 在功能上,Nginx已经具备Squid所拥有的Web缓存加速功能、清除指定URL缓存的功能。而在性能上,Nginx对多核CPU的利用,胜过Squid不少。另外,在反向代理、负载均衡、健康检查、后端服务器故障转移、Rewrite重写、易用性上,Nginx也比Squid强大得多。这使得一台Nginx可以同时作为"负载均衡服务器"与"Web缓存服务器"来使用。以下是配置片段供参考: view plaincopy to clipboardprint? http { ... client_body_buffer_size 512k; proxy_connect_timeout 5; proxy_read_timeout 60; proxy_send_timeout 5; proxy_buffer_size 16k; proxy_buffers 4 64k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 128k; ... #注:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区 proxy_temp_path /data0/proxy_temp_dir; #设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,1天清理一次缓存,硬盘缓存空间大小为30GB。 proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g; } server { ... location / { #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。 proxy_next_upstream http_502 http_504 error timeout invalid_header; proxy_cache cache_one; #对不同的HTTP状态码设置不同的缓存时间 proxy_cache_valid 200 304 12h; proxy_cache_valid 301 302 1h; #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内 proxy_cache_key $host$uri$is_args$args; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_pass http://backend_server; expires 1d; } #用于清除缓存,假设一个URL为 http://192.168.1.44/test.txt,通过访问 http://192.168.4.44/purge/test.txt就可以清除该URL的缓存。 location ~ /purge(/.*) { #设置只允许指定的IP或IP段才可以清除URL缓存。 allow 127.0.0.1; allow 192.168.0.0/16; deny all; proxy_cache_purge cache_one $host$1$is_args$args; } #扩展名以.php、.jsp、.cgi结尾的动态应用程序不缓存。 location ~ .*\.(php|jsp|cgi)?$ { proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_pass http://backend_server; } } http { ... client_body_buffer_size 512k; proxy_connect_timeout 5; proxy_read_timeout 60; proxy_send_timeout 5; proxy_buffer_size 16k; proxy_buffers 4 64k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 128k; ... #注:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区 proxy_temp_path /data0/proxy_temp_dir; #设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,1天清理一次缓存,硬盘缓存空间大小为30GB。 proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g; } server { ... location / { #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。 proxy_next_upstream http_502 http_504 error timeout invalid_header; proxy_cache cache_one; #对不同的HTTP状态码设置不同的缓存时间 proxy_cache_valid 200 304 12h; proxy_cache_valid 301 302 1h; #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内 proxy_cache_key $host$uri$is_args$args; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_pass http://backend_server; expires 1d; } #用于清除缓存,假设一个URL为 http://192.168.1.44/test.txt,通过访问 http://192.168.4.44/purge/test.txt就可以清除该URL的缓存。 location ~ /purge(/.*) { #设置只允许指定的IP或IP段才可以清除URL缓存。 allow 127.0.0.1; allow 192.168.0.0/16; deny all; proxy_cache_purge cache_one $host$1$is_args$args; } #扩展名以.php、.jsp、.cgi结尾的动态应用程序不缓存。 location ~ .*\.(php|jsp|cgi)?$ { proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_pass http://backend_server; } } 同时,对于影响页面展现的静态资源,例如:css, js 等可以放在具有优质带宽的IDC(IDC=互联网数据中心,优质/高速的带宽也比较贵,正所谓一份价钱一分货);其他的静态资源,如图片等可以放在价格相对低廉的IDC中,以域名区分两种静态资源,节省每一分钱。 网络拓扑图 / Ngnix - 1:1 - Resin F5 -- \ Squid - 1:n - Apache 监控统计平台 业务统计 - 用户访问统计 软件性能 - 应用系统监控,例如:请求响应时间…… 硬件/网络性能 - Ganglia监控 其它要点 IE浏览器对同一域名(包括子域名)只能建立2个连接,连接多了只能排队…… 双F5架构,两台职能划分不同,镜像,心跳接管…… Raid存储阵列…… Linux操作系统及其优化…… 本文转自胡奇 51CTO博客,原文链接:http://blog.51cto.com/huqicto/280669,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册