设计模式:005_工厂方法模式

51 阅读2分钟

工厂方法模式

工厂方法模式的目的是使得创建对象和使用对象是分离的。

简单工厂模式

简单工厂模式,又称静态工厂方法模式。 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。 优点:只有一个工厂类来创建产品,简单实用。 缺点:当需要增加产品类型时,需要修改工厂类中的原有逻辑;违背开闭原则(对扩展开放,对修改关闭)。

public interface Sender {
    void send();
}

public class MailSender implements Sender {
    @Override
    public void send() {
        System.out.println("MailSender send");
    }
}

public class SmsSender implements Sender {
    @Override
    public void send() {
        System.out.println("SmsSender send");
    }
}

// 单个静态方法;创建具体产品的统一入口
public class SendFactory {
    public static Sender produce(String type) {
        if ("Mail".equals(type)) {
            return new MailSender();
        }
        if ("Sms".equals(type)) {
            return new SmsSender();
        }
        return new MailSender();
    }
}

// 多个静态方法;在方法层面遵守开闭原则
public class SendFactory2 {
    public static Sender produceMail() {
        return new MailSender();
    }

    public static Sender produceSms() {
        return new SmsSender();
    }
}

工厂方法模式

工厂方法模式,又称多态工厂模式。 工厂方法模式是简单工厂模式的延伸,它继承了简单工厂模式的优点,弥补了简单工厂模式的缺点。 工厂方法模式不再提供一个统一的工厂类来创建所有具体类的实例对象,而是针对不同的具体类实现了不同的工厂。 优点:相比简单工厂模式,遵守了开闭原则,更容易扩展。 缺点:一个具体工厂只能创建一类产品。

public interface Sender {
    void send();
}

public class MailSender implements Sender {
    @Override
    public void send() {
        System.out.println("MailSender send");
    }
}

public class SmsSender implements Sender {
    @Override
    public void send() {
        System.out.println("SmsSender send");
    }
}

// 工厂类有共用的抽象类或接口
// 具体的创建产品由其子类去完成;不同工厂子类创建不同的具体产品
public interface Factory {
    Sender produce();
}

public class MailFactory implements Factory {
    @Override
    public Sender produce() {
        return new MailSender();
    }
}

public class SmsFactory implements Factory {
    @Override
    public Sender produce() {
        return new SmsSender();
    }
}