设计模式1 -- 工厂模式

一、总结
1.工厂模式适合:
凡是需要大量生产产品,并且产品之间有共同的接口时,可以使用工厂模式。
2.优点:
把对象的创建集中在一个地方(工厂),便于维护和管理。
调用者只需要从工厂里获取,并不用管产品怎么生产的。
使用工厂模式更符合 面向接口编程开闭原则 的java编程思想。

二、工厂模式分类
1.普通工厂模式
2.工厂方法模式
3.抽象工厂模式

三、代码示例
0.共同的代码块

/**
 * 发送接口类
 */
public interface SendService {
    public void send();
}
/**
 * email发送实现类
 */
public class EmailSendImpl implements SendService {
    @Override
    public void send() {
        System.out.println("开始发送邮件信息!");
    }
}

/**
 * sms短信发送实现类
 */
public class SmsSendImpl implements SendService{
    @Override
    public void send() {
        System.out.println("开始发送短信信息......");
    }
}

1.普通工厂模式

/**
 *  1. 普通工厂模式: 根据传入的字符串来判断生产哪个产品
 */
public class SendNormalFactory {
    public SendService produce(String type){
        if("email".equals(type)){
            return new EmailSendImpl();
        }else if ("sms".equals(type)){
            return new SmsSendImpl();
        }else {
            return null ;
        }
    }
}

普通工厂如果传入字符串错误,则无法获取正确的产品。

2.工厂方法模式

/**
 * 工厂方法模式: 工厂类中有多个生产方法,每个方法生产一种产品。
 */
public class SendMethodFactory {
    //生产email
    public static SendService emailProduce(){
        return new EmailSendImpl();
    }
    //生产sms
    public static SendService smsProduce(){
        return new SmsSendImpl();
    }
}

工厂方法模式虽然解决了上一个问题,但是在需要新增一种类型的时候,需要修改工厂的代码,不符合设计模式的核心思想:开闭原则。

3.抽象工厂模式
新增抽象工厂类,和各种产品的工厂实现类

/**
 * 抽象工厂接口
 */
public interface SendAbstractFactory {
    public SendService sendFactory();
}

/**
 * SMS  工厂
 */
public class SmsFactory implements SendAbstractFactory {
    @Override
    public SendService sendFactory() {
        return new SmsSendImpl();
    }
}

/**
 * email 工厂
 */
public class EmailFactory implements SendAbstractFactory {
    @Override
    public SendService sendFactory() {
        return new EmailSendImpl();
    }
}

4.测试类

public class FactoryTest {
    public static void main(String[] args){
        /普通工厂模式测试//
        SendNormalFactory normalFac = new SendNormalFactory();
        SendService sendService = normalFac.produce("sms");
        sendService.send();
        ///

        /工厂方法模式测试/
        SendService sendService2 = SendMethodFactory.emailProduce();
        sendService2.send();
        //

        //抽象工厂模式测试/
        SendAbstractFactory sendAbstractFactory = new SmsFactory();
        SendService sendService3 = sendAbstractFactory.sendFactory();
        sendService3.send();
    }
}
  1. 如果需要新增一个类型,则直接新增这个类型的工厂实现类和具体实现类即可,这样做的好处无需修改代码。
    上面三种模式最多使用的就是第三种抽象工厂类。扩展性好。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值