设计模式--工厂模式

当我们在写程序过程中,需要运行时根据参数类型动态的创建对象时(多态),我们一般这么做:

在方法中用if或者switch判断类型,然后new 相对应得对象。

我们在得到对象后,由于有共同的父类,对象的方法名都是一样的,只是每个对象自己的实现不一样(多态的特性)

也就是说,得到对象后,对对象的操作都是一样的,是不变的。

那么现在唯一变的就是根据参数创建对象这一部分。

我们把这一部分抽离出来,重新定义一个类,把创建对象的细节交给这个类,

而原先的代码就可以改成从这个类中获取对象,然后操作对象。具体是怎么获取的,就是新定义的类所做的事了。

我们把这种专门负责创建对象的类成为工厂类。

 

1.简单工厂

简单工厂模式:实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类实例。

简单工厂模式参与者:

  ◊ Product:抽象产品类,将具体产品类公共的代码进行抽象和提取后封装在一个抽象产品类中。

  ◊ ConcreteProduct:具体产品类,将需要创建的各种不同产品对象的相关代码封装到具体产品类中。

  ◊ Factory:工厂类,提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的工厂方法,该方法可以根据所传入参数的不同创建不同的具体产品对象。

  ◊ Client:客户端类,只需调用工厂类的工厂方法并传入相应的参数即可得到一个产品对象。

 

例子:mybitis 日志工厂

mybatis 内置了很多日志框架,如:log4j、slf4j、jdklogging等

如果都不配置,它会按照自己内置的日志顺序从上往下找;

我们也可以在mybatis-config.xml中配置: <setting name="logImpl" value="LOG4J"/>

这个过程就想当于传入一个参数到日志工厂里,日志工厂就会启用相对应的日志框架

我们来用代码简单模拟下

 

抽象产品类:

package com.csk.degisnModel.Factory;

/**
 * 抽象产品类
 */
abstract public class Logging {
    abstract public void getLogging();
}

具体产品类:

package com.csk.degisnModel.Factory;

/**
 * 具体产品 log4j
 */
public class Log4j extends Logging {
    @Override
    public void getLogging() {
        System.out.println("log4j");
    }
}

/**
 * 具体产品 slf4j
 */
public class Slf4j extends Logging {
    @Override
    public void getLogging() {
        System.out.println("slf4j");
    }
}

/**
 * 具体产品 jdklogging
 */
public class JDKLogging extends Logging {
    @Override
    public void getLogging() {
        System.out.println("jdklogging");
    }
}

工厂类:

package com.csk.degisnModel.Factory;

/**
 * 工厂类
 */
public class LoggingFactory {
    public static final int TYPE_LOG4J = 1;
    public static final int TYPE_SLF4J = 2;

    public static Logging createLoggine(int type) {
        switch (type) {
            case TYPE_LOG4J:
                return new Log4j();
            case TYPE_SLF4J:
                return new Slf4j();
            default:
                return new JDKLogging();
        }
    }
}

客户端类:

package com.csk.degisnModel.Factory;

public class Test {
    public static void main(String[] args) {
        //一般我们用的最多的就是log4j
        Logging logging = LoggingFactory.createLoggine(LoggingFactory.TYPE_LOG4J);
        logging.getLogging();
    }
}

未完待续。。。

 

posted @ 2018-10-30 21:47  黄金菜头  阅读(180)  评论(0)    收藏  举报