设计模式 - 工厂模式


工厂模式分为工厂方法模式和抽象工厂模式。


我们什么时候需要使用工厂模式?

对那些实现同一接口的类,我们可以创建一个工厂类,专门用于这些类的实例创建。


一、工厂方法模式 Factory Method

工厂方法模式有3种:普通工厂模式、多个工厂方法模式和静态工厂方法模式。

1、普通工厂模式

/** 1、 实现同一个接口 **/
public interface Sender {
    public void send();
}
/** 2、多个实现类 **/
public class EmailSender implements Sender {
    @override
    public void send() {
<span style="white-space:pre">	</span>System.out.println(“Send Email.”);
    }
}
public class SMSSender implements Sender {
    @override
    public void send() {
<span style="white-space:pre">	</span>System.out.println(“Send SMS.”);
    }
}
/** 3、一个工厂类 **/
public class SendFactory {
    public Sender produce(String type){
        if(“Email”.equals(type)) {
<span style="white-space:pre">	</span>    return new EmailSender();
<span style="white-space:pre">	</span>} else if (“SMS”.equals(type)) {
<span style="white-space:pre">	</span>    return new SMSSender();
<span style="white-space:pre">	</span>} else {
<span style="white-space:pre">	</span>    System.out.println(“No such type!”);
<span style="white-space:pre">	</span>    return null;
        }
    }
}


2、多个工厂方法模式

多个工厂方法模式是对普通工厂模式的改进。

普通工厂模式中对象的创建始终在一个工厂方法中实现,而多个工厂方法模式提供多个工厂方法来创建对象。

public class SendFactory {
    public Sender produceEmail() {
<span style="white-space:pre">	</span>return new EmailSender();
    }
    public Sender produceSMS() {
<span style="white-space:pre">	</span>return new SMSSender();
    }
}


3、静态工厂方法模式

将多个工厂方法模式中的工厂方法都设置为静态,即不需要创建工厂类的实例就可以创建对象。

public class SendFactory {
    public static Sender produceEmail() {
<span style="white-space:pre">	</span>return new EmailSender();
    }
    public static Sender produceSMS() {
<span style="white-space:pre">	</span>return new SMSSender();
    }
}


二、抽象工厂模式 Abstract Factory

抽象工厂模式是对工厂方法模式的改进。

工厂方法模式的缺点:如果想拓展工厂类的功能,我们就必须修改工厂类,在其中添加新的工厂方法,这

显然违反了设计模式的开闭原则(拓展开放、修改关闭)。

抽象工厂模式通过创建多个工厂类,可以避免这个问题。当我们需要拓展功能时,只需要新增工厂类即可,

而不需要修改原工厂类的代码。


/** 1、实现同一个接口 **/
public interface Sender {
    public void send();
}
/** 2、多个实现类 **/
public class EmailSender implements Sender {
    @override
    public void send() {
<span style="white-space:pre">	</span>System.out.println(“Send Email.”);
    }
}
public class SMSSender implements Sender {
    @override
    public void send() {
<span style="white-space:pre">	</span>System.out.println(“Send SMS.”);
    }
}
/** 3、创建多个工厂类 **/
public class SendEmialFactory implements Provider {
    @override
    public Sender produce() {
<span style="white-space:pre">	</span>return new EmailSender();
    }
}
public class SMSEmialFactory implements Provider {
    @override
    public Sender produce() {
<span style="white-space:pre">	</span>return new SMSSender();
    }
}
/** 4、提供对外接口 **/
public interface Provider {
    public Sender produce();
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值