具体代码
发送的接口
public interface ISend {
void sender();
}
public class EmailSend implements ISend {
@Override
public void sender() {
// TODO Auto-generated method stub
System.out.println("发送邮件");
}
}
public class SmsSend implements ISend{
@Override
public void sender() {
// TODO Auto-generated method stub
System.out.println("发送短信");
}
}
public class SendFactory {
public ISend produce(String type) {
ISend send=null;
switch (type) {
case "email":
send=new EmailSend();
break;
case "sms":
send=new SmsSend();
break;
default:
break;
}
return send;
}
}
public class Test {
public static void main(String[] args) {
SendFactory send=new SendFactory();
ISend iSend = send.produce("sms");
iSend.sender();
}
}
/**
* 普通工厂有个局限性
* 那就是如果我字符串输入错误了怎么办?
* 或者我忘记了怎么办?
* 那么现在就可以使用多工厂的这种方法
* 就是在工厂中创建方法 返回接口类型
*
* 如果我现在要对程序扩展 比如现在又能发快递了 怎么办?
* 这时候只需要编写一个快递类实现发的接口
* 然后修改工厂(这里注意是修改工厂从设计模式上来说 不符合开闭原则 这也就衍生出来了 抽象工厂) 见com.factory包
*
* 这样我们不管在哪个类中调用发送的方法得都创建一个工厂对象,如果有100个类需要工厂,那么就得创建100个实例 很麻烦
* 这时候我们就可以把工厂类中的方法改成静态的。
*
* 工厂模式属于创建型,也就是说当我们需要创建大量对象,并且他们都有相同的动作的时候就可以使用工厂模式
* @author wy
*/
public class SendFactory {
public static ISend getSmS(){
return new SmsSend();
}
public static ISend getEmail(){
return new EmailSend();
}
}
public static void main(String[] args) {
SendFactory send=new SendFactory();
send.getSmS().sender();;
}
/**
* 都会相同的发送方法
* 抽象工厂方法和普通的工厂方法有什么具体的区别?
* 相同点都有一个相同的接口
* 并且发送邮箱和发送短信都实现与此接口
* 如果按照普通的多工厂模式来写的话 下面就要开始写多工厂模式类了
* 但是为了闭包原则(多扩展 不修改)
* 我们增加一个接口 这个接口主要干什么呢?
* 这个接口主要用于返回ISend对象
* 然后我们在去创建两个工厂 都实现与Provider这个接口
* 在工厂中创建对象
*
* 打个比方我们现在又能发送快递了
* 我们应该怎么做呢?
* 编写一个类实现ISend接口
* 然后创建一个工厂实现Provider
* 就可以了。不需要去改动现成的代码 也就符合开闭原则的特性了
* @author wy
*
*/
具体代码
public interface ISend {
void send();
}
public class SendEmail implements ISend {
@Override
public void send() {
// TODO Auto-generated method stub
System.out.println("发送邮件");
}
}
public class SendSmS implements ISend {
@Override
public void send() {
// TODO Auto-generated method stub
System.out.println("发送短信");
}
}
注意从这里开始不一样了
public interface Provider {
public ISend produce();
}
public class SendEmailFactory implements Provider{
@Override
public ISend produce() {
// TODO Auto-generated method stub
return new SendEmail();
}
}
public class SendSmsFactory implements Provider{
@Override
public ISend produce() {
// TODO Auto-generated method stub
return new SendSmS();
}
}
public class Test {
public static void main(String[] args) {
Provider provider=new SendEmailFactory();
ISend send = provider.produce();
send.send();
Provider provider1=new SendSmsFactory();
ISend send1 = provider1.produce();
send1.send();
}
}
代码下载