Java | Factory

简介:

工厂模式同单例模式一样,也是Java中最常用的设计模式之一,属于创建型模式,它提供了一种创建对象的最佳方式。能够根据要求调用者提供的信息为接口指定不同的实现类,降低耦合。

接口及其实现类

package factory;

public interface Sender {
    public void send();
}

package factory;

public class SmsSender implements Sender{

    @Override
    public void send() {
        System.out.println("用短信发送...");
    }
}
package factory;

public class EmailSender implements Sender{

    @Override
    public void send() {
        System.out.println("用电子邮箱发送...");
    }
}

简单工厂

package factory;
/**
 * 普通工厂模式,可以需求生产对象
 * 缺点:面对复杂的初始化,会使代码变得巨大
 *      每添加一个实现类都要修改代码,违反了里氏替换原则
 *      可能会产生null对象,引发 空指针异常
 * @author wqj24
 *
 */
public class GeneraSenderFactory {
    
    public Sender produceSender(String msg) {
        
        // 根据消息,指定具体实现类
        if ("email".equals(msg)) {
            return new EmailSender();
        }
        
        if ("sms".equals(msg)) {
            return new SmsSender();
        } 
        
        // 没有符合要求的产品
        return null;
    }
}

上面的缺点就是,每写添加一个实现类就要改工厂类的代码,我们可以通过反射解决这一痛点。

简单工厂(反射)

package factory;
/**
 * 简单工厂的优化
 * 优点:使用反射,避免了添加子类就要修改工厂对象
 */
public class GeneraSenderFactory01 {
    
    public Sender produceSender(Class clazz) {
        
        Sender sender = null;
        
        try {
            sender = (Sender) clazz.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        
        return sender;
    }
}

如果面对初始化复杂的对象,上面那的代码会变得很长,结构性差,可以为每个子类都写一个工厂方法。

多个工厂方法

package factory;

/**
 * 多工厂,每个方法负责生产各自的实例 优点可以应对复杂的初始化
 * 优点:不会产生 null 对象
 *      每个方法负责自己对象的初始化工作,结构清晰。
 */
public class ManySenderFactory {
    
    public Sender produceEmail() {

        return new EmailSender();
    }

    public Sender produceSms() {

        return new SmsSender();
    }
}

也可以将上面的方法改写成静态的,这样就可以不用new对象,直接通过类名调用工厂方法了。

你可能感兴趣的:(Java | Factory)