【设计模式】工厂模式

文章内容输出来源:拉勾教育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();
        }
}

遵守了开闭原则、并实现了工厂设计模式的原有功能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值