工厂方法模式

1.案例1-计算器实现

接上文 简单方法模式例子:

https://blog.youkuaiyun.com/single_wolf_wolf/article/details/78702232

工厂方法模式结果图如下:

新增 公共工厂接口和每种操作的工厂类

//工厂方式模式-简单工厂进阶
public interface IFactory {

    public Operation createOperation();
}


//加减乘除各自建立一个工厂类
public class AddFactory implements  IFactory {

    @Override
    public Operation createOperation(){
        return new OperationAdd();
    }
}


public class SubFactory implements IFactory {

    @Override
    public Operation createOperation(){
        return new OperationSub();
    }
}


public class MulFactory implements IFactory {

    @Override
    public Operation createOperation(){
        return  new OperationMul();
    }
}


public class DivFactory implements IFactory {

    @Override
    public Operation createOperation(){
        return new OperationDiv();
    }
}

 

测试一下:

public class ClientMainTest {

    public static  void main(String[] args){
        IFactory iFactory = new AddFactory();
        Operation operation = iFactory.createOperation();
        operation.set_numberA(2);
        operation.set_numberB(5);
        System.out.println(operation.getResult());
    }
}
/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/bin/java "-javaagent:/Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar=50111:/Applications/IntelliJ IDEA CE.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath /Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/jfxswt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/ant-javafx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/javafx-mx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/packager.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/sa-jdi.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_241.jdk/Contents/Home/lib/tools.jar:/Users/liuxuwei/IdeaProjects/dahuadesignmodel/out/production/dahuadesignmodel factorymethodmodel5.ClientMainTest
7.0

Process finished with exit code 0

同样一个案例,简单工厂模式比工厂模式简单很多,那么,为什么还会有工厂模式呢?

原因如下:

简单工厂模式最大的优点是在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了产品的依赖。

 

工厂方法模式,定义了一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到子类。

如果我们给此方法增加一个功能,求X得Y次方,如果按照简单工厂模式,需要修改运算工厂类中的case分支,从而违背了开发-封闭原则,如果是工厂方法模式,我们只是需要增加该功能的运算类和运算工厂类就可以了,是扩展了变化,而不是修改了变化,符合开发-封闭原则。

 

但是就此案例来说,简单工厂模式,把内部逻辑判断放到了工厂类中进行,工厂方法模式,是放到了客户端进行,即在客户端进行选择具体使用哪个具体的运算。

2.例子2 《大话设计模式》中雷锋工厂

大学生,社区志愿者都可以是雷锋,以此建立了雷锋工厂

public class LeiFeng {

    public void Sweep(){
        System.out.println("扫地");
    }

    public void Wash(){
        System.out.println("洗衣服");
    }

    public void BuyRice(){
        System.out.println("买米");
    }

}


public interface IFactory {

    public LeiFeng createLeiFeng();
}

public class UnderGraduate  extends  LeiFeng{

}

public class UnderGraduateFactory implements IFactory {

    @Override
    public LeiFeng createLeiFeng(){
        return new UnderGraduate();
    }
}

public class Volunteer extends  LeiFeng {
}


public class VolunteerFactory implements IFactory {

    @Override
    public LeiFeng createLeiFeng(){
        return new Volunteer();
    }
}

public class LeifengTestMain {

    public static  void main(String[] args){
        IFactory factory = new UnderGraduateFactory();
        LeiFeng student = factory.createLeiFeng();
        student.BuyRice();
        student.Sweep();
        student.Wash();

        IFactory factory2 = new VolunteerFactory();
        LeiFeng volunteer = factory2.createLeiFeng();
        volunteer.Wash();
        volunteer.Sweep();
        volunteer.BuyRice();
    }
}

结果:

买米
扫地
洗衣服
洗衣服
扫地
买米

Process finished with exit code 0

 

参考《大话设计模式》

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值