


免费预览已结束,剩余9页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单例一个对象模式和简单工厂模式软件开发模式 GOF四个人【四人组】四人帮】一、 单例模式:1. 定义:单例模式又叫Singleton模式。此模式的主要作用是保证在Java的应用程序中,一个类只有一个实例【对象】存在。2. 使用:在项目的很多地方都会用到,比如说数据库的连接。3. 为什么要使用单例模式?好处在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收。一个简单的类及对象,方法的调用版本一:package com.sinojava.singleton;class Singlepublic void say()System.out.println(我开始说话了.);public class SingletonDemo public static void main(String args) Single single1=new Single();single1.say();Single single2=new Single();single2.say();运行结果:我开始说话了.我开始说话了.按照上面的代码,我们可以在main方法中new出无数个Single类的对象,假如现在要求在内存中只能有一个Single对象,该如何实现?分析:我们知道,所有类在实例化对象时都要调用构造方法,所以我们在构造方法处进行修改,将构造方法控制住。让公有的构造方法变为私有的。class Singleprivate Single()public void say()System.out.println(我开始说话了.);public class SingletonDemo public static void main(String args) Single single1=new Single();single1.say();Single single2=new Single();single2.say();现在运行程序,发现运行出错。因为Single的构造方法是私有的,所以不能在外部去调用。Single类的私有构造方法只对此类内部可见,对类外是不可见的。沿此思路,继续思考:既然Single的私有构造方法只对此类内部可见,那我们是否可以在此类内部new出一个对象供外部调用呢?版本二:package com.sinojava.singleton;class Singleprivate Single()static Single s=new Single();public void say()System.out.println(我开始说话了.);public class SingletonDemo public static void main(String args) Single single=Single.s;single.say();运行结果正常。分析:但我们知道,一个规范的java类应该封装属性,即所有的属性都应该是 private修饰。则代码应为:package com.sinojava.singleton;class Singleprivate Single()private static Single s=new Single();public void say()System.out.println(我开始说话了.);public class SingletonDemo public static void main(String args) Single single=Single.s;single.say();但运行程序报错,原因是s是私有变量,在外部不能找到。我们知道规范的java类都会私有化属性,但会为每一个属性配置公有的访问方法。版本三:私有化属性,提供静态的公有的方法,可以使用类名直接调用。package com.sinojava.singleton;class Singleprivate Single()private static Single s=new Single();public static Single getInstance()return s;public void say()System.out.println(我开始说话了.);public class SingletonDemo public static void main(String args) Single single=Single.getInstance();single.say();分析:目前程序基本上没有问题了,但我们发现,s这个引用可以指向无数个new出来的Single对象,因此应在定义Single s前加上final关键字,使程序变为下列版本:package com.sinojava.singleton;class Singleprivate Single()private static final Single s=new Single();public static Single getInstance()return s;public void say()System.out.println(我开始说话了.);public class SingletonDemo public static void main(String args) Single single=Single.getInstance();single.say();这样,就会保证在整个程序的运行过程中,只会有一个 Single的对象。至此,一个简单的单态设计模式就结束了。验证两个引用是否指向了同一对象?package com.sinojava.singleton;class Singleprivate Single()private static final Single s=new Single();public static Single getInstance()return s;public void say()System.out.println(我开始说话了.);public class SingletonDemo public static void main(String args) Single single1=Single.getInstance();Single single2=Single.getInstance();System.out.println(single1=single2);运行结果为:true 简单工厂模式简单工厂模式又叫静态工厂模式。顾名思义,它是用来实例化目标类的静态类。package com.sinojava.factorydemo;interface ICar/汽车的想法有了public void run();public void stop();class BenChi implements ICarpublic void run() System.out.println(奔驰启动了。);public void stop() System.out.println(奔驰停车了。);class Ford implements ICarpublic void run() System.out.println(福特汽车启动了.);public void stop() System.out.println(福特汽车停车了.);public class FactoryDemo1 public static void main(String args) ICar car1=new BenChi();/new Ford()car1.run();car1.stop();运行结果:奔驰启动了。奔驰停车了。分析:上面的做法有一个弊端:现在不论是奔驰还是福特要想实例化对象,就必须他们的父类ICar联系起来,这样他们之间就紧密的耦合了。我们就想,如果能像现实世界中的工厂去生产产品那就可以避免汽车的想法(接口)与某种具体型号的汽车死死绑定。下面我们就增添一个工厂类:package com.sinojava.factorydemo;interface ICar/汽车的想法有了public void run();public void stop();class BenChi implements ICarpublic void run() System.out.println(奔驰启动了。);public void stop() System.out.println(奔驰停车了。);class Ford implements ICarpublic void run() System.out.println(福特汽车启动了.);public void stop() System.out.println(福特汽车停车了.);class Factory/此工厂专门为客户端实例化一个对象public static ICar getCarInstance()return new BenChi();/如果想要福特,就把这里的BenChi改为Ford即可public class FactoryDemo1 public static void main(String args) ICar car1=Factory.getCarInstance();car1.run();car1.stop();运行结果是:奔驰启动了。奔驰停车了。此时就已经写好了一个基本的工厂模式。但现在又有了新的问题,如果想要在main方法中实现可以选择的造某种类型的汽车怎么办?package com.sinojava.factorydemo;interface ICar/汽车的想法有了public void run();public void stop();class BenChi implements ICarpublic void run() System.out.println(奔驰启动了。);public void stop() System.out.println(奔驰停车了。);class Ford implements ICarpublic void run() System.out.println(福特汽车启动了.);public void stop() System.out.println(福特汽车停车了.);class Factory/此工厂专门为客户端实例化一个对象public static ICar getCarInstance(String type)ICar car=null;if(BenChi.equals(type)car=new BenChi();if(Ford.equals(type)car=new Ford();return car;public class FactoryDemo1 public static void main(String args) ICar car1=Factory.getCarInstance(Ford);car1.run();car1.stop();运行结果是:福特汽车启动了.福特汽车停车了.此代码虽然可以运行出结果,但若此时要造出一辆宝马,则会报出空指针错误。这就要求,客户端传过来的参数在工厂中必须要有与之匹配的类,这才能造出来。package com.sinojava.factorydemo;interface ICar/汽车的想法有了public void run();public void stop();class BenChi implements ICarpublic void run() System.out.println(奔驰启动了。);public void stop() System.out.println(奔驰停车了。);class Ford implements ICarpublic void run() System.out.println(福特汽车启动了.);public void stop() System.out.println(福特汽车停车了.);class Factory/此工厂专门为客户端实例化一个对象public static ICar getCarInstance(String type)ICar car=null;if(BenChi.equals(type)car=new BenChi();if(Ford.equals(type)car=new Ford();return car;public class FactoryDemo1 public static void main(String args) ICar car1=Factory.getCarInstance(Baoma);if(car1!=null)car1.run();car1.stop();elseSystem.out.println(工厂造不出这种品牌的汽车);运行结果:工厂造不出这种品牌的汽车此种写法虽然也能实现功能,但仍会有问题,比如现在你要在不改变工厂类的基础上再增加一个丰田汽车类,那么如何办呢?我们可以采用java的反射机制。package com.sinojava.factorydemo;interface ICar/汽车的想法有了public void run();public void stop();class BenChi implements ICarpublic void run() System.out.println(奔驰启动了。);public void stop() System.out.println(奔驰停车了。);class Ford implements ICarpublic void run() System.out.println(福特汽车启动了.);public void stop() System.out.println(福特汽车停车了.);class FengTian implements ICarpublic void run() System.out.println(丰田汽车启动了.);publ
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 居民住宅供暖(面积计费)合同协议范本更新2025
- 广告发布广告效果评估合同2025版(GF-9-0305)
- 2025年食堂订餐服务合同协议书
- 财产保险合同条款解析与应用
- 中小企业合同管理范本大全
- 专业财务服务委托合同模板
- 合同解除条款范本
- 租赁交通工具合同模板
- 节税合同类型手册
- 策划event服务合同
- 2025年全国国家版图知识竞赛题库及答案(中小学组)
- 机加工安全生产培训考核试题及答案(班组级)(精)
- 电梯从业证考试试题及答案解析
- 钢结构厂房装修施工方案报告
- DB32-T 5156-2025 零碳园区建设指南
- 人教版三年级数学上册第一单元分层作业设计
- 浙教版(2024)科学八年级上册 2.1力(第2课时)课件
- 中国外卖大战报告(中英)-高盛-202507
- 咖啡对身体健康的影响研究
- DB32∕T 4569-2023 发泡陶瓷保温板 保温系统应用技术规程
- 2025-2030年中国生猪养殖屠宰行业市场发展分析及发展趋势与投资机会究报告
评论
0/150
提交评论