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

java设计模式

2015-10-26 22:15 155 查看
java23种设计模式.(借鉴他人)

总体来说设计模式分为三大类

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

逐步分析:

1.普通工厂模式:

发送接口:

public interface Sender {
public void  send();
}


两个实现接口的类:

public class MailSend implements Sender{
@Override
public void send() {
System.out.println("发送邮件!");
}

}


public class SmsSend implements Sender {
@Override
public void send() {
System.out.println("发送短信!");
}

}


工厂方法:

public class SendFactory {

public Sender produce(String type) {
if ("mail".equals(type)) {
return new MailSend();
} else if ("sms".equals(type)) {
return new SmsSend();
} else {
System.out.println("请检查类型");
return null;
}
}
}


测试方法:

public class Test001 {
@Test
public void test001() {
SendFactory factory = new SendFactory();
Sender produce = factory.produce("mail");
Sender produce2 = factory.produce("sms");
System.out.println(produce);
System.out.println(produce2);

}

}


运行结果:

fz.song.sjms.ms001.MailSend@442c8ab0
fz.song.sjms.ms001.SmsSend@48454bc7


分析:可以创建不同的对象,但是如果字符串错了则不能创建对象.

2:多个工厂方法模式

与第一个方法区别在于工厂方法:

public class SendFactory {

public Sender produceMailSend() {
return new MailSend();
}
public Sender produceSmsSend() {
return new SmsSend();
}
}


测试:

public void test001() {
SendFactory factory = new SendFactory();
Sender produce = factory.produceMailSend();
Sender produce2 = factory.produceSmsSend();
System.out.println(produce);
System.out.println(produce2);

}


运行结果:

fz.song.sjms.ms002.MailSend@442c8ab0
fz.song.sjms.ms002.SmsSend@48454bc7


分析:经过这个修改,不存在传值的问题了.

3:静态工厂方法模式

修改工厂方法:

public class SendFactory {

public static Sender produceMailSend() {
return new MailSend();
}
public static Sender produceSmsSend() {
return new SmsSend();
}
}


测试方法:

public class Test001 {
@Test
public void test001() {
Sender produce = SendFactory.produceMailSend();
Sender produce2 = SendFactory.produceSmsSend();
System.out.println(produce);
System.out.println(produce2);

}

}


运行结果:

fz.song.sjms.ms003.MailSend@3124805
fz.song.sjms.ms003.SmsSend@253641d6


分析:不需要新建对象,直接使用类加载方法,123相比之下,3比较常用.但是在扩展功能的时候,必将要修改以前的代码,这个是不好的.所以我们要思考,怎么去做才能在不改动源码的情况下,扩展我们的程序.于是就有了抽象工厂方法模式.

4:抽象工厂方法模式

解决方案,我们创建多个工厂类,一旦需要增加新的功能,直接增加工厂类就好了

代码:

接口

public interface Sender {
public void  send();
}


连个实现类:

public class MailSend implements Sender{

@Override
public void send() {
System.out.println("发送邮件!");
}

}


public class SmsSend implements Sender {

@Override
public void send() {
System.out.println("发送短信!");
}

}


工厂方法的接口:

public interface Provider {
public  Sender getSend();

}


工厂方法的实现类:

public class MailSendFactory implements Provider {

@Override
public Sender getSend() {
return new MailSend();
}

}


public class SmsSendFactory implements Provider{

@Override
public Sender getSend() {
return new SmsSend();
}

}


测试类:

public class Test001 {
@Test
public void test001() {

Provider provider = new MailSendFactory();
Sender send = provider.getSend();
Provider provider2 = new SmsSendFactory();
Sender send2 = provider2.getSend();
System.out.println(send);
System.out.println(send2);
}

}


运行结果:


fz.song.sjms.ms003.MailSend@65c461d7

fz.song.sjms.ms003.SmsSend@53839d2e


分析:添加新的功能只需要实现功能接口和工厂方法的接口,就可以添加新的功能,不需要改动以前的代码.

例如:添加发送微信

添加实现类:

public class WeiXInSend implements Sender{

@Override
public void send() {
System.out.println("发送微信");
}

}


添加工厂方法的实现类:

public class WeixinSendFactory implements Provider {

@Override
public Sender getSend() {
return new WeiXInSend();
}

}


测试方法:

public class Test001 {
@Test
public void test001() {

Provider provider = new MailSendFactory();
Sender send = provider.getSend();
Provider provider2 = new SmsSendFactory();
Sender send2 = provider2.getSend();
System.out.println(send);
System.out.println(send2);
Provider provider3=new WeixinSendFactory();
Sender send3 = provider3.getSend();
System.out.println(send3);
}

}


运行结果:

fz.song.sjms.ms003.MailSend@1c093b3c
fz.song.sjms.ms003.SmsSend@220fee85
fz.song.sjms.ms003.WeiXInSend@5bf24008

分析:添加新的功能只要添加相应的方法和工厂方法就可以了,不用修改原代码.利于扩展.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: