java 开发都知道再java 软件架构中有6种软件架构原则,23种设计模式,今天我们就来聊聊23种设计模式中的 工厂模式。
工厂模式按照我的理解可以分为3种。简单工厂、复杂工厂、抽象工厂。玩的高级的可能都在用 抽象工厂包括 spring,现在我们仔细分析一下。
1、简单工厂模式
工作中我们难免会发消息,微信、钉钉等现在我们用简单工厂模式生产一下这几种消息的发送。
Message.java
package simple;
public interface Message {
String getMessage(String name);
}
DingDingMessage.java
package simple;
public class DingDingMessage implements Message{
@Override
public String getMessage(String name) {
//调用钉钉接口发消息
return "钉钉消息";
}
}
WeChatMessage.java
package simple;
public class WeChatMessage implements Message{
@Override
public String getMessage(String name) {
//调用微信接口发消息
return "微信消息";
}
}
SimpleFactory.java
package simple;
public class SimpleFactory {
public Message getMessage(String name){
if("DingDing".equals(name)){
return new DingDingMessage();
} else if ("WeChat".equals(name)){
return new WeChatMessage();
}
return null;
}
}
SimpleFactoryTest.java
package simple;
public class SimpleFactoryTest {
public static void main(String[] args) {
SimpleFactory simpleFactory = new SimpleFactory();
Message dingDing = simpleFactory.getMessage("WeChat");
System.out.println(dingDing);
}
}
好的到此简单工厂已经完成了消息的发送。这种工厂模式其实有有好多不合适的地方。例如现在用户想发一个qq 的消息可以他的自己想现在支持发qq的消息吗,
*Message dingDing = simpleFactory.getMessage(“qq”);*同时我们为了支持这种消息还的实现Message接口再SimpleFactory中增加一种判断,这样用户体验不好,也不符合开闭原则。
2、复杂工厂模式
Factory.java
package complex;
import simple.Message;
public interface Factory {
public Message getMessage();
}
DingDingMessageFactory.java
package complex;
import simple.DingDingMessage;
import simple.Message;
public class DingDingMessageFactory implements Factory{
@Override
public Message getMessage() {
return new DingDingMessage();
}
}
WechatMessageFactory.java
package complex;
import simple.Message;
import simple.WeChatMessage;
public class WechatMessageFactory implements Factory{
@Override
public Message getMessage() {
return new WeChatMessage();
}
}
ComplexFactoryTest.java
package complex;
public class ComplexFactoryTest {
public static void main(String[] args) {
//Factory factory = new DingDingMessageFactory();
Factory factory = new WechatMessageFactory();
System.out.println(factory.getMessage());
}
}
复杂工厂模式按照工厂进行了分工了,现在需要扩展一个qq消息可能就比较简单了只需要 implements Factory就可以了,也符合开闭原则,但是对用户操作还是不太合适他的需要知道 Factory factory = new QqMessageFactory();并行每次扩展需要implements Factory 可能会导致 类增多那现在我们又没有其它的方式了呢,答案是有的那就是抽象工厂。
3、抽象工厂
AbstractFactory.java
package advanced;
import simple.Message;
public abstract class AbstractFactory {
/*
有自己的逻辑实现,还有接口的规范功能
*/
abstract Message getDingDingMessage();
abstract Message getWeChatMessage();
}
AdvancedFactroy.java
package advanced;
import simple.DingDingMessage;
import simple.Message;
import simple.WeChatMessage;
public class AdvancedFactroy extends AbstractFactory{
@Override
public Message getDingDingMessage() {
return new DingDingMessage();
}
@Override
public Message getWeChatMessage() {
return new WeChatMessage();
}
}
AdvancedFactoryTest.java
package advanced;
public class AdvancedFactoryTest {
public static void main(String[] args) {
AdvancedFactroy advancedFactroy = new AdvancedFactroy();
//System.out.println(advancedFactroy.getDingDingMessage());
System.out.println(advancedFactroy.getWeChatMessage());
}
}
现在看是不是有的不一样的感觉呢,用户不需要操作其它的api只需要再advancedFactroy.getxxxMessage()就可以了,并且扩展的时候只需要再AbstractFactory增加一个 abstract即可。
到此不知道您对工厂模式是不是有个大体的理解了呢,今天的分享就到这个,下次我们分享单例设计模式。如果您有自己的理解欢迎和我交流 1129098627@qq.com