您的位置:首页 > 编程语言 > Java开发

设计模式之工厂模式

2016-01-04 00:00 218 查看
摘要: 工厂模式是我们最常用的实例化对象的模式,当我们在new同类时,尽量使用工厂模式,能够提高解耦和可扩展性。

设计模式之工厂模式

一、概述

1.1 简介

工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象。我们在new大量同类时,尽量使用工厂模式,能够提高解耦和可扩展性。

二、实例

2.1 同类

接口

public interface Sender {

public void Send();
}

类1

public class SmsSender implements Sender {

@Override
public void Send() {
System.out.println("this is sms sender!");
}

}

类2

public class MailSender implements Sender {

@Override
public void Send() {
System.out.println("this is mailSender");

}

}


2.2 普通工厂

public class CommonFactory {

/**
* @see 不同工厂类。输入名称
* @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("right type inside,place!");
return null;
}
}
}


2.3 多个工厂

public class MultiFactory {

/**
* @See 多个工厂方法
* @see 缺点:如果需要添加新的方法,则需要修改源码
*/
public Sender produceMail() {
return new MailSender();
}

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

// 静态工厂
public static Sender produceMailTwo() {
return new MailSender();
}

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


2.4 抽象工厂

// 工厂接口
public interface Provider {

/**
* @see 工厂接口、每一个新的类只需要创建一个实现一个工厂接口
* @return
*/
Sender produce();
}
//每一个基类都实现一个工厂
public class SmsFactory implements Provider {

@Override
public Sender produce() {
return new SmsSender();
}

}
public class MailFactory implements Provider {

@Override
public Sender produce() {
return new MailSender();
}

}


2.5 使用

public static void main(String[] args) {
// 1.普通:通过名字来实现。需要扩展必须修改源码
// CommonFactory cf = new CommonFactory();
// Sender sender = cf.produce("sms");
// sender.Send();
// 2.工厂方法:需要扩展必须修改源码
// MultiFactory mf = new MultiFactory();
// Sender sender = mf.produceMail();
// sender.Send();
// 3.静态工厂方法:需要扩展必须修改源码
// Sender sender = MultiFactory.produceMailTwo();
// sender.Send();
// 4.抽象工厂方法:需要扩展直接创建一个工厂接口的工厂(这个用法和行为模式比较类似)
Provider provider = new SmsFactory();
Sender sender = provider.produce();
sender.Send();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息