大话设计模式学习之工厂模式(一)

来源:互联网 发布:淘宝店描述怎么写范例 编辑:程序博客网 时间:2024/05/16 19:36
 简单工厂模式跟工厂模式区别:
  简单工厂模式最大的优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,
  对于客户端来说,去除了与具体产品的依赖。(违背了开放-封闭原则)
 
 工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪个类。
  工厂方法使一个类的实例化延迟到其子类。
  Factory(工厂接口)-----》DemoFactroy:Factory具体工厂类(实现工厂接口)
  根据依赖倒置原则,从简单工厂模式中抽象出来一个接口,再由要生产具体类的工厂去实现接口,即变成了工厂模式。
  工厂方法克服了简单工厂违背开放-封闭原则的缺点,又保持了封装对象创建过程的优点。

  是对简单工厂模式的进一步抽象和推广。利用了多态。缺点:每增加一个产品就需要添加一个产品工厂类,增加了额外的开放量。


简单工厂模式如下:

     

package com.cn.headfirst.cel.factory.demo;public class LeiFeng {public void Sweep(){System.out.println("扫地");}public void Wash(){System.out.println("洗衣");}public void BuyRice(){System.out.println("买米");}}

package com.cn.headfirst.cel.factory.demo;/** * 学雷锋的大学生 * @author jianghd * * 2016年12月19日下午9:55:00 */public class UnderGraduate extends LeiFeng{}

package com.cn.headfirst.cel.factory.demo;/** * 社区志愿者 * @author jianghd * * 2016年12月19日下午9:56:34 */public class Volunteer extends LeiFeng{}

简单工厂类:

package com.cn.headfirst.cel.factory.demo;/** * 简单工厂类 * @author jianghd * * 2016年12月19日下午9:57:46 */public class SimpleFactory {public static LeiFeng CreateLeiFeng(String type){LeiFeng feng=null;switch (type) {case "学雷锋的大学生":feng=new UnderGraduate();break;case "社区志愿者":feng=new Volunteer();break;default:break;}return feng;}}
客户端代码:

package com.cn.headfirst.cel.factory;import com.cn.headfirst.cel.factory.demo.LeiFeng;import com.cn.headfirst.cel.factory.demo.SimpleFactory;public class Test {public static void main(String[] args) {
//简单工厂模式LeiFeng feng=SimpleFactory.CreateLeiFeng("学雷锋的大学生");feng.BuyRice();LeiFeng feng2=SimpleFactory.CreateLeiFeng("学雷锋的大学生");feng2.Sweep();LeiFeng feng3=SimpleFactory.CreateLeiFeng("学雷锋的大学生");feng3.Wash();}}


简单工厂模式在进行实例化时,每次都要写出这个工厂的代码,有重复,且没增加一个继承LeiFeng 类的具体产品都需要去修改SimpleFactory,违背了开放-封闭原则。

以下为工厂方法模式。

抽取LeiFeng类的创建接口


package com.cn.headfirst.cel.factory.demo;/** * 雷锋工厂 * @author jianghd * * 2016年12月19日下午10:16:20 */public interface IFactory {LeiFeng CreateLeiFeng();}

package com.cn.headfirst.cel.factory.demo;/** * 学雷锋的大学生工厂 * @author jianghd * * 2016年12月19日下午10:17:07 */public class UnderGraduateFactory implements IFactory{@Overridepublic LeiFeng CreateLeiFeng() {// TODO Auto-generated method stubreturn new UnderGraduate();}}

package com.cn.headfirst.cel.factory.demo;/** * 社区志愿者工厂 * @author jianghd * * 2016年12月19日下午10:17:55 */public class VolunteerFactory implements IFactory{@Overridepublic LeiFeng CreateLeiFeng() {// TODO Auto-generated method stubreturn new Volunteer();}}

客户端调用:


package com.cn.headfirst.cel.factory;import com.cn.headfirst.cel.factory.demo.IFactory;import com.cn.headfirst.cel.factory.demo.LeiFeng;import com.cn.headfirst.cel.factory.demo.UnderGraduateFactory;public class Test {public static void main(String[] args) {//工厂方法模式IFactory factory=new UnderGraduateFactory();LeiFeng student=factory.CreateLeiFeng();student.BuyRice();student.Sweep();student.Wash();}}




0 0
原创粉丝点击