Java的23中设计模式--工厂方法模式(Factory Method)

1.普通工厂模式

工厂类

/**
 * @Title Factory.java
 * @Package factory.factory1
 * @date 2015-1-22 上午10:16:02
 * @version V1.0
 */
package factory.factory1;

/**
 * @ClassName Factory
 * @date 2015-1-22 上午10:16:02
 */
public class Factory {
    public Sender procedure(String type) {
        if("mail".endsWith(type))
        {
            return new MailSender();
        }
        if("sms".endsWith(type))
        {
            return new SMSSender();
        }else
        {
            System.out.println("未输入正确的类型");
            //更好的话加入异常
            return null;
        }
    }
}

发送器接口

/**
 * @Title Sender.java
 * @Package factory.factory1
 * @date 2015-1-22 上午10:07:24
 * @version V1.0
 */
package factory.factory1;

/**
 * @ClassName Sender
 * @date 2015-1-22 上午10:07:24
 */
public interface Sender {
public void send();
}

发送器实现类

/**
 * @Title MailSender.java
 * @Package factory.factory1
 * @date 2015-1-22 上午10:09:29
 * @version V1.0
 */
package factory.factory1;

/**
 * @ClassName MailSender
 * @date 2015-1-22 上午10:09:29
 */
public class MailSender implements Sender{

    /* (non-Javadoc)
     * @see factory.factory1.Sender#send()
     */
    @Override
    public void send() {
        System.out.println("this is a mailsender");
    }

}
/**
 * @Title SMSSender.java
 * @Package factory.factory1
 * @date 2015-1-22 上午10:14:36
 * @version V1.0
 */
package factory.factory1;

/**
 * @ClassName SMSSender
 * @date 2015-1-22 上午10:14:36
 */
public class SMSSender implements Sender{

    /* (non-Javadoc)
     * @see factory.factory1.Sender#send()
     */
    @Override
    public void send() {
        System.out.println("this is a smssender");
    }

}

测试类:

/**
 * @Title Test.java
 * @Package factory.factory1
 * @date 2015-1-22 上午10:20:19
 * @version V1.0
 */
package factory.factory1;

/**
 * @ClassName Test
 * @date 2015-1-22 上午10:20:19
 */
public class Test {
public static void main(String[] args) {
    Factory factory  = new Factory();
    Sender sender = factory.procedure("mail");
    sender.send();
}
}

这种方法的实现方式对传入的类型要求比较高,就是传入的参数如果错误就不能够获得相对应的产生的东西。

2.多个工厂的方法

/**
 * @Title Factory.java
 * @Package factory.factory1
 * @date 2015-1-22 上午10:16:02
 * @version V1.0
 */
package factory.factory3;

/**
 * @ClassName Factory
 * @date 2015-1-22 上午10:16:02
 */
public class Factory {

        public Sender mailSender(){
            return new MailSender();
        }
        public Sender smsSender(){
            return new SMSSender();
        }

}

将上面的工厂类修改成这样子即可。

测试类:

/**
 * @Title Test.java
 * @Package factory.factory1
 * @date 2015-1-22 上午10:20:19
 * @version V1.0
 */
package factory.factory3;

/**
 * @ClassName Test
 * @date 2015-1-22 上午10:20:19
 */
public class Test {
public static void main(String[] args) {
    Factory factory  = new Factory();
    Sender sender = factory.mailSender();
    sender.send();
}
}

3.静态工厂的方法 将工厂的方法修改成静态的方法

/**
 * @Title Factory.java
 * @Package factory.factory1
 * @date 2015-1-22 上午10:16:02
 * @version V1.0
 */
package factory.factory4;

/**
 * @ClassName Factory
 * @date 2015-1-22 上午10:16:02
 */
public class Factory {

        public static Sender mailSender(){
            return new MailSender();
        }
        public static Sender smsSender(){
            return new SMSSender();
        }

}

测试类

/**
 * @Title Test.java
 * @Package factory.factory1
 * @date 2015-1-22 上午10:20:19
 * @version V1.0
 */
package factory.factory4;

/**
 * @ClassName Test
 * @date 2015-1-22 上午10:20:19
 */
public class Test {
public static void main(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
 * @version V1.0
 */
package factory.factory2;

/**
 * @ClassName Provider
 * @date 2015-1-22 上午10:36:18
 */
public interface Provider {
public Sender procedure();
}

提供一个发送的接口

/**
 * @Title Sender.java
 * @Package factory.factory2
 * @date 2015-1-22 上午10:37:03
 * @version V1.0
 */
package factory.factory2;

/**
 * @ClassName Sender
 * @date 2015-1-22 上午10:37:03
 */
public interface Sender {
public void send();
}

分别两个类来实现这发送接口

/**
 * @Title MailSender.java
 * @Package factory.factory2
 * @date 2015-1-22 上午10:45:05
 * @version V1.0
 */
package factory.factory2;

/**
 * @ClassName MailSender
 * @date 2015-1-22 上午10:45:05
 */
public class MailSender implements Sender{

    /* (non-Javadoc)
     * @see factory.factory2.Sender#send()
     */
    @Override
    public void send() {
        System.out.println("this is a mail sender");
    }

}
/**
 * @Title SmsSender.java
 * @Package factory.factory2
 * @date 2015-1-22 上午10:40:06
 * @version V1.0
 */
package factory.factory2;

/**
 * @ClassName SmsSender
 * @date 2015-1-22 上午10:40:06
 */
public class SmsSender implements Sender{

    /* (non-Javadoc)
     * @see factory.factory2.Sender#send()
     */
    @Override
    public void send() {
        System.out.println("this is a mail sender");
    }

}

提供两个类实现抽象工厂的接口

/**
 * @Title SendMailFactory.java
 * @Package factory.factory2
 * @date 2015-1-22 上午10:44:34
 * @version V1.0
 */
package factory.factory2;

/**
 * @ClassName SendMailFactory
 * @date 2015-1-22 上午10:44:34
 */
public class SendMailFactory implements Provider {

    /* (non-Javadoc)
     * @see factory.factory2.Provider#procedure()
     */
    @Override
    public Sender procedure() {
        // TODO Auto-generated method stub
        return new MailSender();
    }

}
/**
 * @Title SmsSendFactory.java
 * @Package factory.factory2
 * @date 2015-1-22 上午10:41:23
 * @version V1.0
 */
package factory.factory2;

/**
 * @ClassName SmsSendFactory
 * @date 2015-1-22 上午10:41:23
 */
public class SmsSendFactory implements Provider{

    /* (non-Javadoc)
     * @see factory.factory2.Provider#procedure()
     */
    @Override
    public Sender procedure() {
        // TODO Auto-generated method stub
        return new SmsSender();
    }

}

测试类:

/**
 * @Title Test.java
 * @Package factory.factory2
 * @date 2015-1-22 上午10:48:29
 * @version V1.0
 */
package factory.factory2;

/**
 * @ClassName Test
 * @date 2015-1-22 上午10:48:29
 */
public class Test {
public static void main(String[] args) {
    Provider provider = new SendMailFactory();
    Sender sender = provider.procedure();
    sender.send();
}
}
时间: 2024-08-15 09:32:27

Java的23中设计模式--工厂方法模式(Factory Method)的相关文章

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

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实

Java二十三设计模式之------工厂方法模式

一.工厂方法模式 工厂方法模式有三种 1.普通工厂模式:就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建.首先看下关系图: 举例如下:(我们举一个发送邮件和短信的例子) 首先,创建二者的共同接口: public interface Sender { public void Send(); } 其次,创建实现类: public class MailSender implements Sender { @Override public void Send() { System.out.pr

简单工厂模式\工厂方法模式

工厂模式 一.本节目标 我们本节课程主要介绍[工厂模式]的相关知识,将会涉及以下内容: 什么是工厂模式 工厂模式类图 工厂模式代码 工厂模式应用 PS:学习 Java 设计模式之前最好有一定的 Java 语言基础.由于讲这种东西其实比较枯燥,为了让大家学习起来轻松愉快一点,我会尽量使用一些生动.形象和幽默的例子. 二.什么是工厂模式 工厂模式(Factory Pattern)的意义就跟它的名字一样,在面向对象程序设计中,工厂通常是一个用来创建其他对象的对象.工厂模式根据不同的参数来实现不同的分配

工厂方法(Factory Method)模式

一.工厂方法(Factory Method)模式 工厂方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟的子类中. 工厂方法模式是简单工厂模式的进一步抽象和推广.由于使用了多态性,工厂方法模式保持了简单工厂模式的有点,而且客服了它的缺点. 在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给予子类去做.这个核心类仅仅负责给出具体工厂必须实现的接口,而不接触哪一个产品类被实例化这种细节.这使得工厂方法模式可以允许

大话设计模式之简单工厂模式&工厂方法模式&抽象工厂模式

创造类模式分为三种:简单工厂模式,工厂模式和抽象工厂模式. 定义: 简单工厂模式:用一个单独的类来做创造实例的过程. 工厂模式:一个用于创建对象的接口,让子类决定实例化哪一个类,讲一个类的实例化 延迟到其子类. 抽象工厂模式:为创建一组相关或相互依赖的对象的类,而不指定具体类. 结构图: 这是简单工厂的结构图,从图中就很好理解. 简单工厂的优点: 根据用户需要,new出需要的对象. 但是简单工厂弊端: 当新加入一个功能是,就要修改工厂.这个时候,就需要工厂模式了. 从图中我们可以看出: 工厂模式

Java设计模式菜鸟系列(四)工厂方法模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39760895 工厂方法模式(Factory Method) 工厂方法:顾名思义,就是调用工厂里的方法来生产对象(产品)的. 工厂方法实现方式有3种: 一.普通工厂模式.就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 1.uml建模图: 2.代码实现 /** * 示例(一):普通工厂方法 * * 缺点:如果传递的字符串出错,则不能正确创建对象 */ interface Sen

23种设计模式-工厂方法模式

一.工厂方法模式介绍 工厂,生活中工厂是干什么的,是生产东西的.比如衣服加工厂,我们衣服卖家只需要从厂里面拿衣服,只需要看衣服是否是我想要的,衣服具体生产过程我不需要知道,这个我们就可以任务是简单工厂. 在<设计模式之禅>中用女娲造人来打开工厂模式的入口,把八卦炉比喻成工厂,这个比喻个人感觉很恰当.下面为了和女娲造人的区分开,我还是用加工衣服的例子来讲解下工厂模式. 二.工厂模式运用 我们先来看下UML图 图画的好不好,烂不烂我们先不说(我感觉怎么那么不专业).从图中能看出我们需要创建一个服装

结合实例分析简单工厂模式&amp;工厂方法模式&amp;抽象工厂模式的区别

之前写过一篇关于工厂模式(Factory Pattern)的随笔,里面分析了简单工厂模式,但对于工厂方法和抽象工厂的分析较为简略.这里重新分析分析三者的区别,工厂模式是java设计模式中比较简单的一个设计模式,但很多地方都用到了工厂模式,(如解析xml中,jdbc连接数据库等)利用好工厂模式对程序的设计很有用处.工厂模式在一些设计模式的书中分为简单工厂模式,工厂方法模式和抽象工厂模式三类.也有把工厂方法模式划分到抽象工厂模式的,认为工厂方法是抽象工厂模式的特例的一种,就是只有一个要实现的产品接口

简单工厂模式&amp;工厂方法模式&amp;抽象工厂模式的区别

之前写过一篇关于工厂模式(Factory Pattern)的随笔,里面分析了简单工厂模式,但对于工厂方法和抽象工厂的分析较为简略.这里重新分析分析三者的区别,工厂模式是java设计模式中比较简单的一个设计模式,但很多地方都用到了工厂模式,(如解析xml中,jdbc连接数据库等)利用好工厂模式对程序的设计很有用处.工厂模式在一些设计模式的书中分为简单工厂模式,工厂方法模式和抽象工厂模式三类.也有把工厂方法模式划分到抽象工厂模式的,认为工厂方法是抽象工厂模式的特例的一种,就是只有一个要实现的产品接口