• 23种设计模式[2]:工厂方法模式


    一、简单工厂模式(静态工厂方法,不属于23种GOF设计模式之一)

    定义:定义一个用于创建产品对象的方法,由该工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。

    类型:创建类模式

    public interface SmsService {
        void sendSms();
    }
    
    public class MontnetsSmsService implements SmsService {
        @Override
        public void sendSms() {
            System.out.println("通过梦网发送!");
        }
    }
    
    public class EtonenetSmsService implements SmsService {
        @Override
        public void sendSms() {
            System.out.println("通过移通发送!");
        }
    }
    
    public class SmsServiceFactory {
    
        public static SmsService getSmsService(int providerId) {
            SmsService ss;
    
            switch (providerId) {
                case 0:
                    ss = new MontnetsSmsService();
                    break;
                case 1:
                    ss = new EtonenetSmsService();
                    break;
                default:
                    ss = new EtonenetSmsService();
            }
    
            return ss;
        }
    
        public static void main(String[] args) {
            SmsService ss = SmsServiceFactory.getSmsService(0);
            //发送短信
            ss.sendSms();
        }
    }

    二、工厂方法模式

    定义:定义一个用于创建产品对象的接口,由子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。

    类型:创建类模式

    类图:

    工厂方法模式代码:

    public interface SmsService {
        void sendSms();
    }
    
    //工厂接口
    public interface SmsServiceFactory {
        SmsService getSmsService(int providerId);
    }
    
    public class MontnetsSmsService implements SmsService {
        @Override
        public void sendSms() {
            System.out.println("通过梦网发送!");
        }
    }
    
    public class EtonenetSmsService implements SmsService {
        @Override
        public void sendSms() {
            System.out.println("通过移通发送!");
        }
    }
    
    /**
     * 工厂实现类
     */
    public class SmsServiceFactoryImpl implements SmsServiceFactory{
    
        @Override
        public SmsService getSmsService(int providerId) {
            SmsService ss;
    
            switch (providerId) {
                case 0:
                    ss = new MontnetsSmsService();
                    break;
                case 1:
                    ss = new EtonenetSmsService();
                    break;
                default:
                    ss = new EtonenetSmsService();
            }
    
            return ss;
        }
    
        public static void main(String[] args) {
         //向上转型为工程接口
            SmsServiceFactory ssf = new SmsServiceFactoryImpl();
            SmsService ss = ssf.getSmsService(0);
            //发送短信
            ss.sendSms();
        }
    }

    工厂方法模式:

      通过工厂方法模式的类图可以看到,工厂方法模式有四个要素:

    • 工厂接口。工厂接口是工厂方法模式的核心,与调用者直接交互用来提供产品。在实际编程中,有时候也会使用一个抽象类来作为与调用者交互的接口,其本质上是一样的。
    • 工厂实现。在编程中,工厂实现决定如何实例化产品,是实现扩展的途径,需要有多少种产品,就需要有多少个具体的工厂实现。
    • 产品接口。产品接口的主要目的是定义产品的规范,所有的产品实现都必须遵循产品接口定义的规范。产品接口是调用者最为关心的,产品接口定义的优劣直接决定了调用者代码的稳定性。同样,产品接口也可以用抽象类来代替,但要注意最好不要违反里氏替换原则。
    • 产品实现。实现产品接口的具体类,决定了产品在客户端中的具体行为。

      上文提到的简单工厂模式跟工厂方法模式极为相似,区别是:简单工厂只有三个要素,他没有工厂接口,并且得到产品的方法一般是静态的(红色注释部分)。因为没有工厂接口,所以在工厂实现的扩展性方面稍弱,可以算所工厂方法模式的简化版。

    如写的不好,欢迎拍砖!

    PS:

    http://blog.csdn.net/zhengzhb/article/details/7359385

  • 相关阅读:
    java基础--日期--练习集锦
    java基础-数字与字符串-练习集锦
    java-多态-之疑惑
    java-接口与多态-
    java基础 -继承-练习集锦
    java基础-对象-练习集锦
    java基础--数组--练习集锦
    hibernate第二天
    jquery的一些笔记
    struts入门2
  • 原文地址:https://www.cnblogs.com/phpdragon/p/8298188.html
Copyright © 2020-2023  润新知