从这一块开始,我们详细介绍 Java 中 23 种设计模式的概念,应用场景等情况,并结合他们 的特点及设计模式的原则进行分析。
首先,简单工厂模式不属于 23 中涉及模式,简单工厂一般分为:普通简单工厂、多方法简单 工厂、静态方法简单工厂。
简单工厂模式
简单工厂模式模式分为三种:普通就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。首先看下关系图:
image
举例如下:(我们举一个发送邮件和短信的例子)
首先,创建二者的共同接口:
public interface Sender {
** public void Send();**
}
其次,创建实现类:
public class MailSender implements Sender {
** @Override**
** public void Send() {**
** System.out.println("this is mailsender!");**
** }**
}
public class SmsSender implements Sender {
** @Override**
** public void Send() {**
** System.out.println("this is sms sender!");**
** }**
}
最后,建工厂类:
public class SendFactory {
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;
}
}
}
我们来测试下:
public class FactoryTest {
public static void main(String[] args) {
SendFactory factory = new SendFactory();
Sender sender = factory.produce("sms");
sender.Send();
}
}
输出:this is sms sender!
总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通 过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创 建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三 种——静态工厂方法模式。
工厂方法模式(Factory Method)
简单工厂模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对 工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就 用到工厂方法模式,创建一个工厂接口和创建多个工厂实现类,这样一旦需要增加新的功能, 直接增加新的工厂类就可以了,不需要修改之前的代码。
image
请看例子:
public interface Sender {
public void Send();
}
两个实现类:
public class MailSender implements Sender {
@Override
public void Send() {
System.out.println("this is mailsender!");
}
}
public class SmsSender implements Sender {
@Override
public void Send() {
System.out.println("this is sms sender!");
}
}
两个工厂类:
public class SendMailFactory implements Provider {
@Override
public Sender produce(){
return new MailSender();
}
}
public class SendSmsFactory implements Provider{
@Override
public Sender produce() {
return new SmsSender();
}
}
在提供一个接口:
public interface Provider {
public Sender produce();
}
测试类:
public class Test {
public static void main(String[] args) {
Provider provider = new SendMailFactory();
Sender sender = provider.produce();
sender.Send();
}
}
其实这个模式的好处就是,如果你现在想增加一个功能:发及时信息,则只需做一个实现类, 实现 Sender 接口,同时做一个工厂类,实现 Provider 接口,就 OK 了,无需去改动现成的代 码。这样做,拓展性较好!在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
抽象工厂模式
工厂方法模式和抽象工厂模式不好分清楚,他们的区别如下:
工厂方法模式:
**一个抽象产品类,可以派生出多个具体产品类。**
** 一个抽象工厂类,可以派生出多个具体工厂类。**
** 每个具体工厂类只能创建一个具体产品类的实例。**
抽象工厂模式:
** 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。**
** 一个抽象工厂类,可以派生出多个具体工厂类。 **
** 每个具体工厂类可以创建多个具体产品类的实例,也就是创建的是一个产品线下的多个产品。**
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
工厂方法创建 "一种" 产品,他的着重点在于"怎么创建",也就是说如果你开发,你的大量代 码很可能围绕着这种产品的构造,初始化这些细节上面。也因为如此,类似的产品之间有很多 可以复用的特征,所以会和模版方法相随。
抽象工厂需要创建一些列产品,着重点在于"创建哪些"产品上,也就是说,如果你开发,你的 主要任务是划分不同差异的产品线,并且尽量保持每条产品线接口一致,从而可以从同一个抽象工厂继承。
对于 java 来说,你能见到的大部分抽象工厂模式都是这样的:
---它的里面是一堆工厂方法,每个工厂方法返回某种类型的对象。
比如说工厂可以生产鼠标和键盘。那么抽象工厂的实现类(它的某个具体子类)的对象都可以 生产鼠标和键盘,但可能工厂 A 生产的是罗技的键盘和鼠标,工厂 B 是微软的。
这样 A 和 B 就是工厂,对应于抽象工厂; 每个工厂生产的鼠标和键盘就是产品,对应于工厂方法;
用了工厂方法模式,你替换生成键盘的工厂方法,就可以把键盘从罗技换到微软。但是用了抽 象工厂模式,你只要换家工厂,就可以同时替换鼠标和键盘一套。如果你要的产品有几十个, 当然用抽象工厂模式一次替换全部最方便(这个工厂会替你用相应的工厂方法)
所以说抽象工厂就像工厂,而工厂方法则像是工厂的一种产品生产线
网友评论