`

简单工厂模式

阅读更多

引自 spring温故知新对几种设计模式讲解比较清晰

 

1:传统的编程方式


public class Robot {
public String name;
public String color;
public double height;
public double width;
public double weight;
public Robot(String name, String color, double height, double width,
double weight) {
this.name = name;
this.color = color;
this.height = height;
this.width = width;
this.weight = weight;
}
public void Speak(String msg) {
System.out.println(msg);
}
}

实现类

 

import com.iteye.bolide74.action.Robot;
public class IoCTester {
public static void main(String[] args) {
Robot robot0 = new Robot("robot0", "black", 80.000, 40.0000, 1000.0000);
robot0.Speak("Hello,World!");
}
}

 

2: 使用简单工厂

 

import com.iteye.bolide74.action.Robot;
class RobotFactory {
public Robot getRobot(int robotType) {
Robot robot;
switch (robotType) {
case 0:
robot = new Robot("robot0", "black", 80.000, 40.0000, 1000.0000);
break;
case 1:
robot = new Robot("robot1", "white", 90.000, 30.0000, 800.0000);
break;
default:
robot = new Robot("defaultRobot", "red", 10.000, 10.0000, 300.0000);
break;
}
return robot;
}
}
public class IoCTester {
public static void main(String[] args) {
RobotFactory robotFactory = new RobotFactory();
Robot robot = robotFactory.getRobot(0);
robot.Speak("Hello,World! My name is " + robot.name);

}

}

 

3:使用静态工厂

 

package com.iteye.bolide74.action;
public class Robot2 {
public String name;
public String color;
public double height;
public double width;
public double weight;


private Robot2(String name, String color, double height, double width,
double weight) {
this.name = name;
this.color = color;
this.height = height;
this.width = width;
this.weight = weight;
}


public static Robot2 getRobot(int robotType) {
Robot2 robot2;
switch (robotType) {
case 0:
robot2 = new Robot2("robot0", "black", 80.000, 40.0000, 1000.0000);
break;
case 1:
robot2 = new Robot2("robot1", "white", 90.000, 30.0000, 800.0000);
break;
default:
robot2 = new Robot2("defaultRobot", "red", 10.000, 10.0000, 300.0000);
break;
}
return robot2;
}
public void Speak(String msg) {
System.out.println(msg + ",我是" + this.name);
}
}


实现类
package com.iteye.bolide74.tester;
import com.iteye.bolide74.action.Robot2;
public class IoCTester {
public static void main(String[] args) {
Robot2 robot2 = Robot2.getRobot(1);
robot2.Speak("Hello,world!");

 

注意!这里有两个细节:
1) Robot2的构造方法是private的,这样的好处就是所有Robot2的使用者或者说是实现类在获取机器人的时
候,只能通过getRobot2来获取,这样就实现了规范化,而不是有些地方是直接new的,有些地方是用
getRobot方法来的(一个项目,不一定就是一个程序员写到老的...)。
2) Robot2获取实例的getRobot方法是static静态的(所以才叫静态工厂嘛~)!由于Robot2的构造函数是
private的了,不能直接new一个实例,那就更加不可能调用需要实例化才能使用的getRobot方法了,所以必须
要设置为static方法,就可以无需实例化直接调用!

 

 

现在为了解决简单工厂和静态工厂模式的缺陷,我们可以把Speak这个方法(或者可以称为功能模块)抽取出
来,作为一个接口来实现,这样只要People类和Robot类都实现这个接口,就能够通用了。
package com.iteye.bolide74.impl;
public interface ISpeaker {
public void Speak(String msg);
}

接下来是新的Robot类和People类,它们都同时实现了ISpeaker这个接口,两者都用了不同的Speak内容来区
分人类和机器人说话方式的不同:
package com.iteye.bolide74.action;
import com.iteye.bolide74.impl.ISpeaker;
public class Robot implements ISpeaker {
public String name;
public String color;
public double height;
public double width;
public double weight;
public Robot(String name, String color, double height, double width,
double weight) {
this.name = name;
this.color = color;
this.height = height;
this.width = width;
this.weight = weight;
}
@Override
public void Speak(String msg) {
System.out.println(msg + ",我是" + this.name + ",我的体重为" + this.weight);
}
}
package com.iteye.bolide74.action;
import com.iteye.bolide74.impl.ISpeaker;
public class People implements ISpeaker {
public String name;
public double height;
public double weight;:

public People(String name, double height, double weight) {
this.name = name;
this.height = height;
this.weight = weight;
}
@Override
public void Speak(String msg) {
System.out.println(msg + ",我是" + this.name + ",我就不告诉你我有多重!");
}
}
接下来就是工厂类和实现类了。这个工厂类就不是生产具体的实例对象了,而是生产一个通用的能够Speak的抽
象实例(某个能打招呼的东西,或许是人类,或许是机器人)
package com.iteye.bolide74.tester;
import com.iteye.bolide74.action.People;
import com.iteye.bolide74.action.Robot;
import com.iteye.bolide74.impl.ISpeaker;
class SpeakerFactory {
public ISpeaker getSpeaker(int speakerType) {
ISpeaker speaker;
switch (speakerType) {
case 0:
speaker = new Robot("robot0", "black", 80.000, 40.0000, 1000.0000);
break;
case 1:
speaker = new People("GirlFriend", 1.64, 99.99);
break;
default:
speaker = new Robot("defaultRobot", "red", 10.000, 10.0000,
300.0000);
break;

}
return speaker;
}
}
public class IoCTester {
public static void main(String[] args) {
SpeakerFactory speakerFactory = new SpeakerFactory();
ISpeaker speaker = speakerFactory.getSpeaker(1);
speaker.Speak("Hello,World!");
}
}
输出结果:
引用
Hello,World!,我是GirlFriend,我就不告诉你我有多重!
如此一来的话就很方便了,我们不用再像之前的简单工厂模式那样每次打招呼的时候都要重新实例化一个不同
的工厂,而是实例化了一个能生成某种类别不确定但是一定能够speak打招呼的对象的通用工厂,然后用统一
ISpeaker接口来实例化“打招呼”这个功能模块,至于打招呼是让机器人去还是让女朋友去就只要抽象工厂生
成的时候告诉它一下代号就行了。
这样的话就能够在尽可能少修改实现代码的前提下,尽可能的实现各种情况下的同一种功能。

4:单例模式

 

 

package com.iteye.bolide74.action;
public class Girlfriend {
private static Girlfriend girlfriend; //类的静态成员属性形式声明一个实例
public String name;
public double height;
public double weight;
private Girlfriend(String name, double height, double weight) {
this.name = name;
this.height = height;
this.weight = weight;
}
public static Girlfriend getGirlfriend() {
if (girlfriend == null)
girlfriend = new Girlfriend("GirlFriend", 1.64, 99.99);
return girlfriend;
}
public void Speak(String msg) {
System.out.println(msg + ",我是" + this.name + ",我是唯一的女朋友");
}
}
大家可以看到这个Girlfriend类,跟前面一篇的静态工厂模式非常像,它们的构造函数都是private私有的,都有
一个静态的实例生成方法。作用也是相同的,就是限制生成实例的办法只有一种,就是通过getGirlfriend()方法
来获取。
区别有两点:
1) 静态工厂生成的实例对象{Robot2 robot2;},都是在getRobot()这个生产实例的方法内部声明的,也就是说
这些引用对象都是局部变量。
而单例模式里生成的实例对象{private static Girlfriend girlfriend;},是在getGirlfriend()这个生产实例的方
法的外部声明,并且还加了static静态修饰词的,这就代表了它这个是类的静态成员属性,它是唯一的并且是无
需实例化就能使用的(因为是static的),只不过这里又加了一个private私有修饰词,不能被外部直接访问而已。
2) Girlfriend类里的getGirlfriend()方法内部,加了一个判断,作用是如果girlfriend这个静态类属性,同时也是
这个类的一个实例对象为null,那么就新建一个实例对象给它;如果不为null,也就是已经有实例了,那么就直
接返回已经存在的那个实例对象。

分享到:
评论

相关推荐

    java基于ssm+jsp珠宝购物网站系统源码 带毕业论文

    【资源说明】 1、开发环境:ssm框架;内含Mysql数据库;JSP技术 2、项目代码都经过严格调试,代码没有任何bug!下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 4、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。

    基于SSM的企业工资管理系统.zip(毕设&课设&实训&大作业&竞赛&项目)

    项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。

    基于java的大学生兼职系统设计与实现.docx

    基于java的大学生兼职系统设计与实现.docx

    沙威玛传奇(电脑游戏)

    沙威玛传奇(电脑游戏)

    使用加权最小二乘法进行电力系统状态估计。测量包括电压幅值、功率注入和功率流Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    vue+SpringBoot488基于springboot的医务室管理系统java毕业设计源码含论文.rar

    jdk版本:jdk1.8+ 前端:vue.js+ElementUI 开发工具:IDEA 或者eclipse都支持 编程语言: java 框架支持:springboot 数据库: mysql 版本不限 数据库工具:Navicat/SQLyog都可以 详细技术:java+springboot+vue+MYSQL+MAVEN 前端采用的Vue框架,后端采用java语言,sprinboot框架,mybatis操作数据源,使用软件:idea,eclipse、MySQL。完成了用户登录管理等模块的设计与实现。完成了系统数据库的设计,并基于MySQL数据库管理系统

    P1024 [NOIP2001 提高组] 一元三次方程求解

    题目描述: 给出一个简单的一元三次方程,要求三个解。 思路: 这些大佬们为何都用一些神奇的算法……还把这道题评为普及组难度……其实只要枚举就可以了,注意一下double精度。 这道题的代码可以比一些入门组的还要短……这道题其实应该在普及-难度

    java基于ssm+jsp个体户商城管理系统源码 带毕业论文

    【资源说明】 1、开发环境:ssm框架;内含Mysql数据库;JSP技术 2、项目代码都经过严格调试,代码没有任何bug!下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 4、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。

    基于SSM+JSP的大学生创新创业平台竞赛管理子系统.zip(毕设&课设&实训&大作业&竞赛&项目)

    项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。

    JPEG文件,一个上传开发板,一个解压后拖到Ubuntu的Home中

    JPEG文件,一个上传开发板,一个解压后拖到Ubuntu的Home中

    java基于ssm+vue服装品牌的推广及应用网站系统源码 带毕业论文

    【资源说明】 1、开发环境:ssm框架;内含Mysql数据库;VUE技术 2、项目代码都经过严格调试,代码没有任何bug!下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 4、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。

    HTML5+CSS3网站设计学习。.zip(毕设&课设&实训&大作业&竞赛&项目)

    项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。

    [基于Python]自己写的一个微信跳一跳自动游戏程序(针对安卓手机)。(毕设&课设&实训&大作业&竞赛&项目)

    项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还[基于Python]自己写的一个微信跳一跳自动游戏程序(针对安卓手机)。 全自动运行 自动适应不同分辨率 自动调整各个参数误差.zip行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。

    微信小程序购物商城管理系统.zip(毕设&课设&实训&大作业&竞赛&项目)

    项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。

    基于java的网上图书商城系统设计与实现.docx

    基于java的网上图书商城系统设计与实现.docx

    基于Q-learning算法和ε-greedy策略解决随机生成的方形迷宫问题Matlab代码实现.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    java毕业设计源码ssm953基于Java技术的儿童成长系统的设计与实现+vue程序数据库含论文.rar

    前端采用的Vue框架,后端采用java语言,ssm框架,mybatis操作数据源,使用软件:idea,eclipse、MySQL。完成了用户登录管理等模块的设计与实现。完成了系统数据库的设计,并基于MySQL数据库管理系统 本系统基于SSM(Spring+SpringMVC+MyBatis)框架,适用于毕业设计, 基于B/S模式, mysql数据库,感兴趣的朋友们可以下载研究一下。 jdk版本:jdk1.8+ 前端:vue.js+ElementUI 开发工具:IDEA 或者eclipse都支持 编程语言: java 框架支持:ssm 数据库: mysql 版本不限 数据库工具:Navicat/SQLyog都可以 详细技术:java+ssm+vue+MYSQL+MAVEN

    用 Android Studio(AS) 以 JNI 方式开发 OpenCV 的最小工程.zip(毕设&课设&实训&大作业&竞赛

    项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。

    vue+SpringBoot738药品仓储管理系统java毕业设计源码含论文.zip

    jdk版本:jdk1.8+ 前端:vue.js+ElementUI 开发工具:IDEA 或者eclipse都支持 编程语言: java 框架支持:springboot 数据库: mysql 版本不限 数据库工具:Navicat/SQLyog都可以 详细技术:java+springboot+vue+MYSQL+MAVEN 前端采用的Vue框架,后端采用java语言,sprinboot框架,mybatis操作数据源,使用软件:idea,eclipse、MySQL。完成了用户登录管理等模块的设计与实现。完成了系统数据库的设计,并基于MySQL数据库管理系统

    给Wpf的datagrid动态添加title和数据的方法.zip

    给Wpf的datagrid控件动态添加title和数据的方法

Global site tag (gtag.js) - Google Analytics