美文网首页菜鸟要飞
设计模式(Design Patterns)工厂方法模式(Fact

设计模式(Design Patterns)工厂方法模式(Fact

作者: 万总有点菜 | 来源:发表于2017-08-20 20:25 被阅读2次

    工厂方法模式分为三种:

    普通工厂模式

    建立一个工厂类,对实现了同一接口的一些类进行实例的创建。首先看下关系图:

    举例如下:(我们举一个发送邮件和短信的例子)

    • 创建接口类
    package com.sima.java.factorymethod;
    
    /**
     * Created by maple on 2017-08-19.
     */
    public interface Sender {
        public void send();
    }
    
    • 创建实体类
    package com.sima.java.factorymethod;
    
    /**
     * Created by maple on 2017-08-19.
     */
    public class MailSender implements Sender {
        public void send() {
            System.out.println("send Mail!");
        }
    }
    
    package com.sima.java.factorymethod;
    
    /**
     * Created by maple on 2017-08-19.
     */
    public class SmsSender implements Sender {
        public void send() {
            System.out.println("send SMS!");
        }
    }
    
    
    • 创建工厂类
    package com.sima.java.factorymethod;
    
    
    
    /**
     * Created by maple on 2017-08-19.
     */
    public class SendFactory {
    
        public Sender produce(String type){
            if ("mail".equals(type)){
                return new MailSender();
            }else if ("sms".equals(type)){
                return new SmsSender();
            }else {
                System.out.println("输入类型有误");
                return null;
            }
        }
    }
    
    • 测试
    package com.sima.java;
    
    import com.sima.java.factorymethod.SendFactory;
    import com.sima.java.factorymethod.Sender;
    
    public class App 
    {
        public static void main( String[] args )
        {
            System.out.println( "Hello World!" );
            SendFactory sendFactory = new SendFactory();
            Sender sender = sendFactory.produce("mail");
            sender.send();
            sender = sendFactory.produce("sms");
            sender.send();
        }
    }
    
    • 运行结果


    多个工厂方法模式

    对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。关系图:

    • 改造工厂类
    package com.sima.java.factorymethod;
    
    /**
     * Created by maple on 2017-08-19.
     */
    public class SendFactoryMore {
    
        public Sender produceMail(){
            return new MailSender();
        }
    
        public Sender produceMsm(){
            return new SmsSender();
        }
    }
    
    • 测试
    package com.sima.java;
    
    import com.sima.java.factorymethod.SendFactory;
    import com.sima.java.factorymethod.SendFactoryMore;
    import com.sima.java.factorymethod.Sender;
    
    public class App 
    {
        public static void main( String[] args )
        {
            System.out.println( "Hello World!" );
            SendFactoryMore sendFactoryMore = new SendFactoryMore();
            Sender sender = sendFactoryMore.produceMail();
            sender.send();
            sender = sendFactoryMore.produceMsm();
            sender.send();
    
        }
    }
    
    • 运行结果

    静态工厂方法模式

    将上面的多工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。

    • 改造工厂类
    package com.sima.java.factorymethod;
    
    /**
     * Created by maple on 2017-08-19.
     */
    public class SendFactoryMoreStatic {
    
        public static Sender produceMail(){
            return new MailSender();
        }
    
        public static Sender produceMsm(){
            return new SmsSender();
        }
    }
    
    • 测试
    package com.sima.java;
    
    import com.sima.java.factorymethod.SendFactory;
    import com.sima.java.factorymethod.SendFactoryMore;
    import com.sima.java.factorymethod.SendFactoryMoreStatic;
    import com.sima.java.factorymethod.Sender;
    
    public class App 
    {
        public static void main( String[] args )
        {
            System.out.println( "Hello World!" );
    
            Sender sender = SendFactoryMoreStatic.produceMail();
            sender.send();
            sender = SendFactoryMoreStatic.produceMsm();
            sender.send();
        }
    }
    
    • 运行结果

    小结

    总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。

    相关文章

      网友评论

        本文标题:设计模式(Design Patterns)工厂方法模式(Fact

        本文链接:https://www.haomeiwen.com/subject/rwutdxtx.html