java中factory方法_Java的23中设计模式--工厂方法模式(Factory Method)
1.普通工厂模式
工厂类
/*** @Title Factory.java
* @Package factory.factory1
* @date 2015-1-22 上午10:16:02
*@versionV1.0*/
packagefactory.factory1;/*** @ClassName Factory
* @date 2015-1-22 上午10:16:02*/
public classFactory {publicSender procedure(String type) {if("mail".endsWith(type))
{return newMailSender();
}if("sms".endsWith(type))
{return newSMSSender();
}else{
System.out.println("未输入正确的类型");//更好的话加入异常
return null;
}
}
}
发送器接口
/*** @Title Sender.java
* @Package factory.factory1
* @date 2015-1-22 上午10:07:24
*@versionV1.0*/
packagefactory.factory1;/*** @ClassName Sender
* @date 2015-1-22 上午10:07:24*/
public interfaceSender {public voidsend();
}
发送器实现类
/*** @Title MailSender.java
* @Package factory.factory1
* @date 2015-1-22 上午10:09:29
*@versionV1.0*/
packagefactory.factory1;/*** @ClassName MailSender
* @date 2015-1-22 上午10:09:29*/
public class MailSender implementsSender{/*(non-Javadoc)
* @see factory.factory1.Sender#send()*/@Overridepublic voidsend() {
System.out.println("this is a mailsender");
}
}
/*** @Title SMSSender.java
* @Package factory.factory1
* @date 2015-1-22 上午10:14:36
*@versionV1.0*/
packagefactory.factory1;/*** @ClassName SMSSender
* @date 2015-1-22 上午10:14:36*/
public class SMSSender implementsSender{/*(non-Javadoc)
* @see factory.factory1.Sender#send()*/@Overridepublic voidsend() {
System.out.println("this is a smssender");
}
}
测试类:
/*** @Title Test.java
* @Package factory.factory1
* @date 2015-1-22 上午10:20:19
*@versionV1.0*/
packagefactory.factory1;/*** @ClassName Test
* @date 2015-1-22 上午10:20:19*/
public classTest {public static voidmain(String[] args) {
Factory factory= newFactory();
Sender sender= factory.procedure("mail");
sender.send();
}
}
这种方法的实现方式对传入的类型要求比较高,就是传入的参数如果错误就不能够获得相对应的产生的东西。
2.多个工厂的方法
/*** @Title Factory.java
* @Package factory.factory1
* @date 2015-1-22 上午10:16:02
*@versionV1.0*/
packagefactory.factory3;/*** @ClassName Factory
* @date 2015-1-22 上午10:16:02*/
public classFactory {publicSender mailSender(){return newMailSender();
}publicSender smsSender(){return newSMSSender();
}
}
将上面的工厂类修改成这样子即可。
测试类:
/*** @Title Test.java
* @Package factory.factory1
* @date 2015-1-22 上午10:20:19
*@versionV1.0*/
packagefactory.factory3;/*** @ClassName Test
* @date 2015-1-22 上午10:20:19*/
public classTest {public static voidmain(String[] args) {
Factory factory= newFactory();
Sender sender=factory.mailSender();
sender.send();
}
}
3.静态工厂的方法 将工厂的方法修改成静态的方法
/*** @Title Factory.java
* @Package factory.factory1
* @date 2015-1-22 上午10:16:02
*@versionV1.0*/
packagefactory.factory4;/*** @ClassName Factory
* @date 2015-1-22 上午10:16:02*/
public classFactory {public staticSender mailSender(){return newMailSender();
}public staticSender smsSender(){return newSMSSender();
}
}
测试类
/*** @Title Test.java
* @Package factory.factory1
* @date 2015-1-22 上午10:20:19
*@versionV1.0*/
packagefactory.factory4;/*** @ClassName Test
* @date 2015-1-22 上午10:20:19*/
public classTest {public static voidmain(String[] args) {//Factory factory = new Factory();
Sender sender =Factory.mailSender();
sender.send();
}
}
4.抽象工厂模式
工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定 的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。因为抽象工厂不 太好理解,我们先看看图,然后就和代码,就比较容易理解。
提供一个工厂的接口
/*** @Title Provider.java
* @Package factory.factory2
* @date 2015-1-22 上午10:36:18
*@versionV1.0*/
packagefactory.factory2;/*** @ClassName Provider
* @date 2015-1-22 上午10:36:18*/
public interfaceProvider {publicSender procedure();
}
提供一个发送的接口
/*** @Title Sender.java
* @Package factory.factory2
* @date 2015-1-22 上午10:37:03
*@versionV1.0*/
packagefactory.factory2;/*** @ClassName Sender
* @date 2015-1-22 上午10:37:03*/
public interfaceSender {public voidsend();
}
分别两个类来实现这发送接口
/*** @Title MailSender.java
* @Package factory.factory2
* @date 2015-1-22 上午10:45:05
*@versionV1.0*/
packagefactory.factory2;/*** @ClassName MailSender
* @date 2015-1-22 上午10:45:05*/
public class MailSender implementsSender{/*(non-Javadoc)
* @see factory.factory2.Sender#send()*/@Overridepublic voidsend() {
System.out.println("this is a mail sender");
}
}
/*** @Title SmsSender.java
* @Package factory.factory2
* @date 2015-1-22 上午10:40:06
*@versionV1.0*/
packagefactory.factory2;/*** @ClassName SmsSender
* @date 2015-1-22 上午10:40:06*/
public class SmsSender implementsSender{/*(non-Javadoc)
* @see factory.factory2.Sender#send()*/@Overridepublic voidsend() {
System.out.println("this is a mail sender");
}
}
提供两个类实现抽象工厂的接口
/*** @Title SendMailFactory.java
* @Package factory.factory2
* @date 2015-1-22 上午10:44:34
*@versionV1.0*/
packagefactory.factory2;/*** @ClassName SendMailFactory
* @date 2015-1-22 上午10:44:34*/
public class SendMailFactory implementsProvider {/*(non-Javadoc)
* @see factory.factory2.Provider#procedure()*/@OverridepublicSender procedure() {//TODO Auto-generated method stub
return newMailSender();
}
}
/*** @Title SmsSendFactory.java
* @Package factory.factory2
* @date 2015-1-22 上午10:41:23
*@versionV1.0*/
packagefactory.factory2;/*** @ClassName SmsSendFactory
* @date 2015-1-22 上午10:41:23*/
public class SmsSendFactory implementsProvider{/*(non-Javadoc)
* @see factory.factory2.Provider#procedure()*/@OverridepublicSender procedure() {//TODO Auto-generated method stub
return newSmsSender();
}
}
测试类:
/*** @Title Test.java
* @Package factory.factory2
* @date 2015-1-22 上午10:48:29
*@versionV1.0*/
packagefactory.factory2;/*** @ClassName Test
* @date 2015-1-22 上午10:48:29*/
public classTest {public static voidmain(String[] args) {
Provider provider= newSendMailFactory();
Sender sender=provider.procedure();
sender.send();
}
}
java中factory方法_Java的23中设计模式--工厂方法模式(Factory Method)相关推荐
- java web简单工厂模式_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...
- Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式
工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...
- JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...
- 简单工厂模式+工厂方法模式
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...
- 工厂模式 java_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...
- java sleep唤醒_详解Java中的线程让步yield()与线程休眠sleep()方法
Java中的线程让步会让线程让出优先级,而休眠则会让线程进入阻塞状态等待被唤醒,这里我们对比线程等待的wait()方法,来详解Java中的线程让步yield()与线程休眠sleep()方法 线程让步: ...
- java中char类型转换成int类型的两种方法
java中char类型转换成int类型的两种方法 方法一: 第一种利用Integer包装类的方法Integer.parseInt Copychar ch = '9'; if (Character.is ...
- java类名可以是数字吗_在 Java 中,一个类可同时定义许多同名的方法,这些方法的形式参数的个数、类型或顺序各不相同,传回的值也可以不相同。这种面向对象程序特性称为( )。_学小易找答案...
[简答题]Java 支持多继承吗 ? [单选题]以下关于继承的叙述正确的是( ). [单选题]在 Java 中,一个类可同时定义许多同名的方法,这些方法的形式参数的个数.类型或顺序各不相同,传回的值也 ...
- Java的二十三种设计模式(单例模式、工厂方法模式、抽象工厂模式)
从这一块开始,我们详细介绍Java中23种设计模式的概念,应用场景等情况,并结合他们的特点及设计模式的原则进行分析. 创建型模式(5种):用于描述"怎样创建对象",它的主要特点是& ...
最新文章
- A Simple Math Problem
- Android数据存储之sharedpreferences与Content Provider
- 你最喜欢哪款游戏的界面风格,为什么?
- 键盘上所有键位的ascii值
- CxImage 使用报错解决办法
- 计算机课程意见建议,对计算机课程的建议论文
- 关于信息安全认证CISP与CISSP的对比及分析
- error2203matlab,小编详解Win10安装MATLAB软件提示Internal error 2203的解决方法
- require.js的简单使用
- 大数据就业前景怎么样?
- USACO 3.4 Raucous Rockers (rockers)
- 2021云计算技能竞赛真题
- 【Git】fatal Not a git repository or any of the parent direc
- AMCL代码详解(七)amcl中的kd-Tree
- 计算机有效策略无法连接打印机,共享打印提示:Windows无法连接到打印机,拒绝访问...
- 大疆精灵4RTK的运用
- 舞动黑白方格旗 IBM Power 8重构市场格局
- Windows系统搭建GitServer--Bonobo Git Server
- java-net-php-python-springboot健身房管理系统计算机毕业设计程序
- python高级数据分析_8、Python 数据分析-Pandas高级操作
热门文章
- 回溯算法之购物车(0-1 背包问题)
- 判断输入的整数是否为素数_C语言 | 判断是否素数
- for循环延时_前端中的事件循环eventloop机制
- crm开源系统 tp框架_八个开源的 Spring Boot 前后端分离项目,一定要收藏!
- 拿了年终奖后,发现自己又拖后腿了?对不起,可能事实并没有那么糟糕...
- 解锁一个新技巧,让你舒服到不想起床
- 男孩子也是要护肤的!!!
- 当时我就震惊了:无穷带来的各种悖论
- 干货|MIT线性代数课程精细笔记[第一课]
- c语言二维数组代码,C语言之二维数组(示例代码)