#大话设计模式之工厂方法模式#

  说实话,工厂方法模式其实跟简单工厂模式很相似,就是修复了简单工厂的一些不符合开闭原则的bug,但如果你的项目比较小型,还是推荐简单工厂来比较简单方便,毕竟工厂方法还是有美中不足的地方。

  现在有一个需求:编写一个学雷锋帮助老人的类。

  我们使用简单工厂模式和工厂方法模式写,两个区别就在于界面类和工厂类,其余一样。

雷锋父类(包含了雷锋的方法,扫地,买米... ...)

package FactoryMethodPattern;

public class LeiFeng {
    public void sweep(){
        System.out.println("扫地");
    }
    public void wash(){
        System.out.println("洗衣服");
    }
    public void buyRice(){
        System.out.println("买米");
    }
}

大学生子类

package FactoryMethodPattern;

public class Undergraduate extends LeiFeng{

}

社区志愿者子类(跟大学生一样的功能,工厂的两个两个零件)

package FactoryMethodPattern;

public class Volunteer extends LeiFeng{

}

简单工厂类(此类最大特点在于里面使用了switch选择实例化对象,当需要增加新对象比如“学雷锋的小学生”我们就需要修改工程类,修改类是违法开闭原则的,所以有问题!)

package FactoryMethodPattern;

public class SimpleFactory {
    public static LeiFeng craeteLeiFeng(String type){
        LeiFeng result = new LeiFeng();
        switch(type){
        case "学雷锋的大学生":
            result = new Undergraduate();
            break;
        case "社区志愿者":
            result =new Volunteer();
            break;
        }
        return result;
    }
}

工厂方法类(对比简单工厂类,将switch的对象分为不同的类,当需要增加对象时,只需要新增类就好了,符合开闭原则,缺点是增加产品工厂需要额外的开发量。)

package FactoryMethodPattern;

public interface IFactory {
    LeiFeng CreateLieFeng();
}
class UndergraduateFactory implements IFactory{

    @Override
    public LeiFeng CreateLieFeng() {
        // TODO Auto-generated method stub
        return new Undergraduate();
    }
    
}
class VolunteerFactory implements IFactory{

    @Override
    public LeiFeng CreateLieFeng() {
        // TODO Auto-generated method stub
        return new Volunteer();
    }
    
}

界面类(printFrame1是简单工厂的界面,printFrame2是工厂方法的界面,差不多的)

package FactoryMethodPattern;

public class Main {
    public void printFrame1(){
        LeiFeng student = SimpleFactory.craeteLeiFeng("学雷锋的大学生");
        
        student.buyRice();
        student.sweep();
        student.wash();
    }
    public void printFrame2(){
        IFactory factory = new UndergraduateFactory();
        LeiFeng student = factory.CreateLieFeng();
        
        student.buyRice();
        student.sweep();
        student.wash();
    }
    public static void main(String[] args) {
        Main main = new Main();
        main.printFrame1();
        System.out.println();
        main.printFrame2();
    }
}

使用方法:同样是为了更方便的实例化对象而产生的两个工厂,工厂方法编程风格更优良,但也有美中不足增加开销的缺点,但还是利大于弊。

Ending... ... 

简单来说:

普通过程:new特定的对象,调用特定的方法;

模式过程:修补了简单工程模式里面,需要新增新方法的时候,需要修改源代码!!违反开闭原则,这里的措施是,要新增新方法,你就新增个新类吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值