无论工厂还是策略模式,每个具体工具类(工厂模式)/具体策略类(策略模式)中执行方法名都是一样的,都和抽象工具(工厂模式)/抽象策略(策略模式)中方法名一样的

1、简单工厂类

  思想:将创建何种工具交由工厂。将原本逻辑if...else...中“变”的部分抽离为具体工具类,调用方通过在工厂中传入标志符来确定创建何种工具  

  结构图: 

          

  

  代码实现:

  抽象工具类: 

public abstract class FAbsStep {
    public abstract void run();
}

 

 

  具体工具类: 

public class FBanmaStep extends FAbsStep{
    public void run() {
        System.out.println("斑马编译步骤开始执行");
        System.out.println("斑马编译步骤...");
        System.out.println("斑马编译步骤执行结束");
    }
}


public class FshangqiStep extends FAbsStep{
    public void run() {
        System.out.println("上汽编译步骤开始执行");
        System.out.println("上汽编译步骤...");
        System.out.println("上汽编译步骤执行结束");
    }
}

 

  工厂类:用于创建具体工具(通过传入string类型标志位来判断创建何种工具)

public class Ffactory {
    public FAbsStep getStep(String name) {  //①通过name来判断创建何种具体工具  ②返回抽象产品结果
        if(name.equals("banma")) {
            return new FBanmaStep();
        }else {
            return new FshangqiStep();
        }
    }
}

 

  main方法

public class Fmain {
    public static void main(String[] args) {
        Ffactory tfactory=new Ffactory();
        FAbsStep step=tfactory.getStep("shangqi"); //创建出具体工具实例
        step.run();  //执行具体实例方法
    }
}

 

  

2、策略模式

  思想:根据传入何种策略具体执行对应行为

  结构图:

  

  

  代码实现:

  抽象策略:

public abstract class TAbsStep {
    public abstract void run();
}

 

  具体策略: 

public class TBanmaStep extends FAbsStep{
    public void run() {
        System.out.println("斑马编译步骤开始执行");
        System.out.println("斑马编译步骤...");
        System.out.println("斑马编译步骤执行结束");
    }
}

public class TshangqiStep extends FAbsStep{
    public void run() {
        System.out.println("上汽编译步骤开始执行");
        System.out.println("上汽编译步骤...");
        System.out.println("上汽编译步骤执行结束");
    }
}

 

  环境类:抽象策略类作为成员变量,接收具体策略 

//TEnvironment环境类,用户传入具体策略类名进而执行具体策略
public class TEnvironment {  
    private FAbsStep fAbsStep;  //抽象策略   策略类作为环境类的成员变量
    public TEnvironment(FAbsStep fAbsStep) { //环境类构造方法,抽象策略作为形参
        this.fAbsStep=fAbsStep;
    }
    public void exec() {
        fAbsStep.run();
    }
}

 

  main类:

public class Tmain {
    public static void main(String[] args) {
        TEnvironment tEnvironment = new TEnvironment(new TshangqiStep()); //环境类传入具体策略方法,用来执行对应策略方法
        tEnvironment.exec();
    }
}

 

 

 

简单工厂VS策略

1.首先看一下接收的参数:简单工厂类中的Ffactory.getStep() 方法接收的是字符串,返回的是一个 FAbsStep(抽象工厂类)对象;而 策略模式Environment 类初始化时需要接收一个 new TshangqiStep()(具体策略类)对象。 

2.简单工厂类中是根据接收的条件创建一个相应的对象,而 Context 类接收的是一个对象,可以调用方法去执行此对象的方法

 

总结简单工厂模式和策略模式
1.从类型上说:简单工厂模式属于创建型模式,而策略模式属于行为型模式。
2.接下来,看一个小例子:

 斧子有很多种,有一个工厂专门负责生产各种需求的斧子。

工厂模式:
1)根据你给出的目的来生产不同用途的斧子,例如要砍人,那么工厂生产砍人斧子,要伐木就生产伐木斧子。
2)即根据你给出一些属性来生产不同行为的一类对象返回给你。
3)关注对象创建
策略模式:
1)用工厂生产的斧子来做对应的事情,例如用砍人的斧子来砍人,用伐木的斧子来伐木。
2)即根据你给出对应的对象来执行对应的方法。
3)关注行为的选择
3.简单工厂模式:根据客户选择的条件,来帮客户创建一个对象。
 策略模式:客户给它一个创建好的对象,它来帮客户做相应的事

 

 

三、抽象工厂模式

结构图:

 

简单工厂模式中工厂类代码中存在很多业务逻辑:

public class Ffactory {
    public FAbsStep getStep(String name) {  //通过name来判断创建何种具体工具
        if(name.equals("banma")) {
            return new FBanmaStep();
        }else {
            return new FshangqiStep();
        }
    }
}

 

抽象工厂将简单工厂中工厂类业务代码抽离实现。具体逻辑如下

业务逻辑:肯德基和麦当劳都有汉堡和可乐产品,现需要针对不同客户要求,生产不同品牌的产品

 

抽象产品类

//抽象汉堡产品
public interface IHumburg {
    public HumburgDto getHumberDes();
}


//抽象可乐产品
public interface ICole {
    public ColeDto getCole();
}

 

 

具体产品类

//肯德基劳可乐
public class KfcCole implements ICole {

    @Override
    public ColeDto getCole() {
        ColeDto coleDto=new ColeDto();
        coleDto.setIsIce(false);
        coleDto.setName("肯德基可乐");
        coleDto.setPrize(12);
        coleDto.setSize('M');
        
        return coleDto;
    }

}

//肯德基汉堡
public class KfcHumburge implements IHumburg {

    @Override
    public HumburgDto getHumberDes() {
        HumburgDto humburgDto=new HumburgDto();
        humburgDto.setName("肯德基汉堡");
        humburgDto.setPrice(26);
        humburgDto.setSize('M');
        return humburgDto;
    }

}

//麦当劳可乐
public class McCole implements ICole {

    @Override
    public ColeDto getCole() {
        ColeDto coleDto=new ColeDto();
        coleDto.setIsIce(true);
        coleDto.setName("麦当劳可乐");
        coleDto.setPrize(10);
        coleDto.setSize('L');
        
        return coleDto;
    }

}

//麦当劳汉堡
public class McHumburge implements IHumburg {

    @Override
    public HumburgDto getHumberDes() {
        HumburgDto humburgDto=new HumburgDto();
        humburgDto.setName("麦当劳汉堡");
        humburgDto.setPrice(22);
        humburgDto.setSize('L');
        return humburgDto;
    }

}

 

 

抽象工厂类  --生产抽象产品

public interface IFactory {
    public IHumburg getHumbuger();
    public ICole getCole();
}

 

 

具体工厂类 --生产具体产品

//肯德基工厂
public class KfcFactory implements IFactory {

    public IHumburg getHumbuger() {
        return new KfcHumburge();
    }

    @Override
    public ICole getCole() {
        // TODO Auto-generated method stub
        return new KfcCole();
    }
    

}

//麦当劳产品
public class McFactory implements IFactory {

    public IHumburg getHumbuger() {
        return new McHumburge();
    }

    @Override
    public ICole getCole() {
        // TODO Auto-generated method stub
        return new McCole();
    }
    

}

 

测试类

public class Test {

    public static void main(String[] args) {
        IFactory kfcFactory=new KfcFactory(); //测试代码中直接创建对应产品工厂,而无需在工厂类中通过业务代码判断
        IHumburg kfcHumbuger=kfcFactory.getHumbuger();
        ICole kfcCole=kfcFactory.getCole();
        System.out.println(JSON.toJSONString(kfcHumbuger)+" "+JSON.toJSONString(kfcCole));
        
        IFactory McFactory=new McFactory();
        IHumburg mcHumbuger=McFactory.getHumbuger();
        ICole mcCole=McFactory.getCole();
        System.out.println(JSON.toJSONString(mcHumbuger)+" "+JSON.toJSONString(mcCole));
    }

}

 

posted on 2019-07-12 15:15  colorfulworld  阅读(1443)  评论(0编辑  收藏  举报