文章内容输出来源:拉勾教育JAVA就业训练营
总目录跳转链接:总目录
设计模式总目录:【设计模式】设计模式(目录)
如有侵权请联系本人
邮箱:xiaogueika@tom.com
一、普通工厂模式
1、基本概念
普通工厂方法模式就是建立一个工厂类,对实现了同一接口的不同实现类进行实例的创建。
2、类图结构
UML图实现代码:
Sender 接口
package designmode.factory;
/**
* @author: gk
* @date: 2021年01月25日 16:44
* @version: 1.0
*/
public interface Sender {
/**
* 自定义抽象方法来描述发送的行为
*/
void send();
}
邮件类(实现Sender接口)
package designmode.factory;
/**
* @author: gk
* @date: 2021年01月25日 16:48
* @version: 1.0
*/
public class MailSender implements Sender{
@Override
public void send() {
System.out.println("正在发送邮件...");
}
}
短信类(实现Sender接口)
package designmode.factory;
/**
* @author: gk
* @date: 2021年01月25日 16:45
* @version: 1.0
*/
public class SmsSender implements Sender{
@Override
public void send() {
System.out.println("正在发送短信");
}
}
普通工厂类(用于创建对象)
package designmode.factory;
/**
* @author: gk
* @date: 2021年01月25日 16:49
* @version: 1.0
*/
public class SendFactory {
//自定义成员方法实现对象的创建
public Sender produce(String type){
if("mail".equalsIgnoreCase(type)){
return new MailSender();
}
if("sms".equalsIgnoreCase(type)){
return new SmsSender();
}
return null;
}
}
实现类
package designmode.factory;
/**
* @author: gk
* @date: 2021年01月25日 16:51
* @version: 1.0
*/
public class SendFactoryTest {
public static void main(String[] args) {
//缺点:代码复杂,可读性略差
//优点:扩展性和可维护性更强!尤真是在创建大量对象的前提下
//1.声明工厂类类型的引用指向工厂类类型到的对条
SendFactory sf = new SendFactory();
//2.调用生产方法来实现对象的创到
Sender sender = sf.produce("mail");
//3.使用对象调用方法模拟发生的行为
sender.send();
}
}
- 缺点:代码复杂,可读性略差
- 优点:扩展性和可维护性更强!尤真是在创建大量对象的前提下
3、主要缺点
在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,并且可能出现空指针异常。
二、多个工厂方法模式
1、类图结构
改进:
普通工厂类(用于创建对象)
package designmode.factory;
/**
* @author: gk
* @date: 2021年01月25日 16:49
* @version: 1.0
*/
public class SendFactory {
//自定义成员方法实现对象的创建
public Sender produceMail(){
return new MailSender();
}
public Sender producaSms(){
return new SmsSender();
}
}
实现类
package designmode.factory;
/**
* @author: gk
* @date: 2021年01月25日 16:51
* @version: 1.0
*/
public class SendFactoryTest {
public static void main(String[] args) {
//1.声明工厂类类型的引用指向工厂类类型到的对条
SendFactory sf = new SendFactory();
//2.调用生产方法来实现对象的创到
Sender sender = sf.produceMail();
//3.使用对象调用方法模拟发生的行为
sender.send();
}
}
2、主要缺点
在多个工厂方法模式中,为了能够正确创建对象,先需要创建工厂类的对象才能调用工厂类中的生
产方法。
三、静态工厂方法模式
1、类图结构
改进:
普通工厂类(用于创建对象)
public class SendFactory {
//自定义成员方法实现对象的创建
public Sender produce(String type){
if("mail".equalsIgnoreCase(type)){
return new MailSender();
}
if("sms".equalsIgnoreCase(type)){
return new SmsSender();
}
return null;
}
public static Sender produceMail(){
return new MailSender();
}
public static Sender producaSms(){
return new SmsSender();
}
}
实现类
public class SendFactoryTest {
public static void main(String[] args) {
//1.调用生产方法来实现对象的创到
Sender sender = SendFactory.produceMail();
//2.使用对象调用方法模拟发生的行为
sender.send();
}
}
2、实际意义
工厂方法模式适合:凡是出现了大量的产品需要创建且具有共同的接口时,可以通过工厂方法模式进行创建。
3、主要缺点
工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序生产新的产品,就必须对工厂类的代码进行修改,这就违背了开闭原则。
四、抽象工厂模式
1、类图结构
改进:
描述产品的生产行为接口
public interface Provider {
//自定义抽象方法描述产品的生产行为
Sender produce();
}
两个实现类()
public class MailSendFactory implements Provider{
@Override
public Sender produce() {
return new MailSender();
}
}
public class SmsSendFactory implements Provider {
@Override
public Sender produce() {
return new SmsSender();
}
}
实现类
public class SendFactoryTest {
public static void main(String[] args) {
//1.声明工厂类类型的引用指向工厂类类型到的对条
Provider p = new SmsSendFactory();
//2.调用生产方法来实现对象的创到
Sender sender = p.produce();
//3.使用对象调用方法模拟发生的行为
sender.send();
}
}
遵守了开闭原则、并实现了工厂设计模式的原有功能