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)相关推荐

  1. java web简单工厂模式_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  2. Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式

    工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...

  3. JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  4. 简单工厂模式+工厂方法模式

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  5. 工厂模式 java_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  6. java sleep唤醒_详解Java中的线程让步yield()与线程休眠sleep()方法

    Java中的线程让步会让线程让出优先级,而休眠则会让线程进入阻塞状态等待被唤醒,这里我们对比线程等待的wait()方法,来详解Java中的线程让步yield()与线程休眠sleep()方法 线程让步: ...

  7. java中char类型转换成int类型的两种方法

    java中char类型转换成int类型的两种方法 方法一: 第一种利用Integer包装类的方法Integer.parseInt Copychar ch = '9'; if (Character.is ...

  8. java类名可以是数字吗_在 Java 中,一个类可同时定义许多同名的方法,这些方法的形式参数的个数、类型或顺序各不相同,传回的值也可以不相同。这种面向对象程序特性称为( )。_学小易找答案...

    [简答题]Java 支持多继承吗 ? [单选题]以下关于继承的叙述正确的是( ). [单选题]在 Java 中,一个类可同时定义许多同名的方法,这些方法的形式参数的个数.类型或顺序各不相同,传回的值也 ...

  9. Java的二十三种设计模式(单例模式、工厂方法模式、抽象工厂模式)

    从这一块开始,我们详细介绍Java中23种设计模式的概念,应用场景等情况,并结合他们的特点及设计模式的原则进行分析. 创建型模式(5种):用于描述"怎样创建对象",它的主要特点是& ...

最新文章

  1. A Simple Math Problem
  2. Android数据存储之sharedpreferences与Content Provider
  3. 你最喜欢哪款游戏的界面风格,为什么?
  4. 键盘上所有键位的ascii值
  5. CxImage 使用报错解决办法
  6. 计算机课程意见建议,对计算机课程的建议论文
  7. 关于信息安全认证CISP与CISSP的对比及分析
  8. error2203matlab,小编详解Win10安装MATLAB软件提示Internal error 2203的解决方法
  9. require.js的简单使用
  10. 大数据就业前景怎么样?
  11. USACO 3.4 Raucous Rockers (rockers)
  12. 2021云计算技能竞赛真题
  13. 【Git】fatal Not a git repository or any of the parent direc
  14. AMCL代码详解(七)amcl中的kd-Tree
  15. 计算机有效策略无法连接打印机,共享打印提示:Windows无法连接到打印机,拒绝访问...
  16. 大疆精灵4RTK的运用
  17. 舞动黑白方格旗 IBM Power 8重构市场格局
  18. Windows系统搭建GitServer--Bonobo Git Server
  19. java-net-php-python-springboot健身房管理系统计算机毕业设计程序
  20. python高级数据分析_8、Python 数据分析-Pandas高级操作

热门文章

  1. 回溯算法之购物车(0-1 背包问题)
  2. 判断输入的整数是否为素数_C语言 | 判断是否素数
  3. for循环延时_前端中的事件循环eventloop机制
  4. crm开源系统 tp框架_八个开源的 Spring Boot 前后端分离项目,一定要收藏!
  5. 拿了年终奖后,发现自己又拖后腿了?对不起,可能事实并没有那么糟糕...
  6. 解锁一个新技巧,让你舒服到不想起床
  7. 男孩子也是要护肤的!!!
  8. 当时我就震惊了:无穷带来的各种悖论
  9. 干货|MIT线性代数课程精细笔记[第一课]
  10. c语言二维数组代码,C语言之二维数组(示例代码)