您的位置:首页 > 其它

可复用面向对象软件基础——设计模式(二)之工厂方法模式

2016-12-15 12:57 567 查看

一、工厂方法模式分类(3种)

普通工厂模式

多个工厂方法模式

静态工厂方法模式

二、工厂方法模式详解

(1)普通工厂模式

普通工厂模式就是建立一个工厂类,对实现了同一接口的一些进行实例的创建。



// 1、创建不同产品的共同接口
public interface Sender {
/**
* 邮寄接口中有一个邮寄方法待实现
*/
public void Send();
}


/**
* 2、(实现类)邮件邮寄类实现了邮寄接口,实现其邮寄的抽象方法
* @author barnett
*
*/
public class MailSender implements Sender {

@Override
public void Send() {
System.out.println("I am MailSender!");
}
}


/**
* 短信邮寄类实现了邮寄接口,实现其邮寄的抽象方法
* @author barnett
*
*/
public class SmsSender implements Sender {

@Override
public void Send() {
System.out.println("I am SmsSender!");
}
}


/**
* 3、工厂类,负责多次制造产品(new出复用的类)
* @author barnett
*
*/
public class SendFactory {

/**
* 工厂类中的生产方法
* @param type  输入要生产的产品类型
* @return  返回一个产品
*/
public Sender produce(String type) {
if("mail".equals(type)) {
return new MailSender();
} else if("sms".equals(type)) {
return new SmsSender();
} else {
System.out.println("请输入正确的类型!");
return null;
}
}
}


/**
* 4、测试类,实例一个工厂,生产多个产品
* @author barnett
*
*/
public class FactoryTest {

public static void main(String[] args) {
// 创建一个工厂(可多次生产)
SendFactory factory = new SendFactory();
// 使用工厂按照要求生产相应产品
Sender sender = factory.produce("sms");
// 调用产品的方法
sender.Send();
Sender sender2 = factory.produce("mail");
sender2.Send();
}
}


工厂优势

1、 实例出一个工厂,再生产工厂内可以生产的产品,则只需要调用工厂的生产方法,通过传入不同的参数,生产不同的产品

2、传统方式则每次要生产一个产品时都需要实例化,然后调用生产方法

3、这样一来,要生产产品时,无需了解内部细节,交由工厂管理,节省资源

(2)多个工厂方法模式

多个工厂方法模式,是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象

而多个工厂方法模式是提供多个工厂方法,分别创建对象。



/**
* 工厂类,负责多次制造产品
* @author barnett
*
*/
public class MultiMethodSendFactory {

/**
* 专门生产邮件邮寄器的方法
* @return
*/
public Sender produceMail() {
return new MailSender();
}

/**
* 专门生产短信邮寄器的方法
* @return
*/
public Sender produceSms() {
return new SmsSender();
}
}


/**
* 测试类,实例一个工厂,生产多个产品
* @author barnett
*
*/
public class MultiMethodFactoryTest {

public static void main(String[] args) {
// 创建一个工厂(可多次生产)
MultiMethodSendFactory factory = new MultiMethodSendFactory();
// 根据不同的需求调用不同的方法
Sender mailSender = factory.produceMail();
mailSender.Send();
Sender smsSender = factory.produceSms();
smsSender.Send();
}
}


(3)静态工厂方法模式

将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例直接调用即可。

/**
* 工厂类,负责多次制造产品
* @author barnett
*
*/
public class StaticMethodSendFactory {

/**
* 专门生产邮件邮寄器的方法
* @return
*/
public static Sender produceMail() {
return new MailSender();
}

/**
* 专门生产短信邮寄器的方法
* @return
*/
public static Sender produceSms() {
return new SmsSender();
}
}


/**
* 测试类,直接调用工厂中的静态方法,生产产品
* @author barnett
*
*/
public class StaticMethodFactoryTest {

public static void main(String[] args) {
Sender mailSender = StaticMethodSendFactory.produceMail();
mailSender.Send();
Sender smsSender = StaticMethodSendFactory.produceSms();
smsSender.Send();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐