简单工厂模式、工厂模式和抽象工厂模式例子

一、简单工厂模式

算法的封装: 定义一个抽象的算法接口,提供不同算法的公共接口方法。其他具体算法继承这个抽象类,并实现具体的算法。

简单工厂类: 作为一个独立的类,实现了针对不同的算法进行实例化。

题目:输入两个数和运算符,得出结果。

这里写图片描述

package simpleFacotory;

public class Operation {
  protected int a;
  protected int b;
  public int getA() {
    return a;
  }
  public void setA(int a) {
    this.a = a;
  }
  public int getB() {
    return b;
  }
  public void setB(int b) {
    this.b = b;
  }

 public int getResult(){
   return 0;
 }
}
//算法一
package simpleFacotory;

public class OperationAdd extends Operation {
     @Override
    public int getResult() {
        return a+b;
    }
}
//算法二
package simpleFacotory;

public class OperationSub extends Operation {

  public int getResult(){
    return a-b ;
  }
}
//父工厂
package simpleFacotory;

public class OperationFactory {

  public static Operation createOperation(char operate) {
    Operation oper = null;
    switch (operate) {
      case '+':
        oper = new OperationAdd();
        break;
      case '-':
        oper = new OperationSub();
        break;
    }
    return oper;
  }

}

总结:
优点:客户端不需要修改代码,因为业务逻辑是在工厂类中判断的。
缺点:当需要增加新的运算类的时候,不仅需新加运算类,还要修改工厂类,违反了开闭原则。

二、工厂模式

这里写图片描述

/*
 * 运算接口
 */
public interface Operation {

    public int getResult(int a,int b);

}
/*
 * 算法一
 */
public class OperationAdd implements Operation{

    @Override
    public int getResult(int a, int b) {
        return a+b;
    }

}
/*
 * 算法二
 */
public class OperationSub implements Operation{

    @Override
    public int getResult(int a, int b) {
        // TODO Auto-generated method stub
        return a-b;
    }

}
/*
 * 工厂接口
 */
public interface OperationFactory {
    public Operation creatOperation();
}
/*
 * 加法工厂
 */
public class AddFactory implements OperationFactory{

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

}
/*
 * 减法工厂
 */
public class SubFactory implements OperationFactory{

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

}
/*
 * 客户端
 */
public class App {
    public static void main(String[] args) {
        OperationFactory operationFacoty = new AddFactory();
        OperationAdd add = (OperationAdd) operationFacoty.creatOperation();
        System.out.println("- result ->"+add.getResult(5,10));
    }
}

总结:
这个和简单工厂有区别,简单工厂模式只有一个工厂,工厂方法模式对每一个产品都有相应的工厂

好处:增加一个运算类(例如N次方类),只需要增加运算类和相对应的工厂,两个类,不需要修改工厂类。

缺点:增加运算类,会修改客户端代码,工厂方法只是把简单工厂的内部逻辑判断移到了客户端进行。

三、抽象工厂模式

首先要明白几个概念,以电脑为例:

1.产品族:例如一个电脑由CPU,显卡,显示器,硬盘等组成,组成电脑的这些产品就是产品族

2.产品等级:惠普CPU,inter CPU,就是两个产品等级

3.产品族等级:惠普电脑,联想电脑

如果只涉及产品等级的话,是不需要应用抽象工厂模式,使用工厂方法模式即可;
工厂方法模式解决的范畴是产品等级(AMD处理器,Intel处理器等);
抽象工厂模式解决的范畴是产品族等级(联想PC、惠普PC等);

以中国家庭和美国家庭为例,中国家庭和美国家庭就属于两个产品族等级。
组成一个美国家庭的美国父亲和美国母亲就是美国家庭的产品族。
中国母亲和美国母亲就是产品等级。

这里写图片描述

/*
 * mother接口
 */
public interface IMother {
    public void printName();
}

/*
 * Father接口
 */
public interface IFather {
    public void printName();
}

/*
 * 中国母亲类
 */
public class ChineseMother implements IMother{

    private String name;

    public ChineseMother(String name) {
        this.name = name;
    }


    public String getName() {
        return name;
    }



    public void setName(String name) {
        this.name = name;
    }



    @Override
    public void printName() {
        System.out.println("中国母亲名:"+name);
    }

}

/*
 * 中国父亲类
 */
public class ChineseFather implements IFather{

    private String name;

    public ChineseFather(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void printName() {
        System.out.println("中国父亲名:"+this.name);
    }

}

/*
 * 美国父亲类
 */
public class AmericanFather implements IFather{

    private String name;

    public AmericanFather(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void printName() {
        System.out.println("美国父亲名:"+this.name);
    }

}


/*
 * 美国母亲类
 */
public class AmericanMother implements IMother{

    private String name;

    public AmericanMother(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void printName() {
        System.out.println("美国母亲名:"+this.name);
    }

}


/*
 * 家庭工厂
 */
public interface IFamilyFactory {
    public IMother createMother(String name);
    public IFather createFather(String name);
}


/*
 * 中国家庭工厂
 */
public class ChineseFamilyFatory implements IFamilyFactory{

    @Override
    public IMother createMother(String name) {
        return new ChineseMother(name);
    }

    @Override
    public IFather createFather(String name) {
        return new ChineseFather(name);
    }

}

/*
 * 美国家庭工厂
 */
public class AmericanFamilyFatory implements IFamilyFactory{

    @Override
    public IMother createMother(String name) {
        return new AmericanMother(name);
    }

    @Override
    public IFather createFather(String name) {
        return new AmericanFather(name);
    }

}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值