掌握Java设计模式之模版设计模式和抽象工厂设计模式(5)

原创
2018/04/11 17:18
阅读数 306

      (本篇博客已于2019-08-29优化更新)     

      序言:说一下为什么一下子讲这两个设计模式,因为本人觉得他们有异曲同工之妙。

1、概念

1.1、模版设计模式概念:项目中我们经常用到,jedisTemplate,StringJedisTemplate等等都有一些增删改差操作,
他们就是封装的工具类,操作数据库增删改查,这就是模板设计模式的理念,少重复写代码了。
1.2 抽象工厂模式:先说一下简单工厂,我的理解就是相当于淘宝,天猫,京东的一个小店铺一样,这个店铺就相当于一个
简单工厂,这个店铺提供上衣,裤子等等,对于抽象工厂,他就是京东或者淘宝,它提供众多的店铺,这就是它的概念。

淘宝创造多个店铺,每个店铺卖产品,三者的关系就是:抽象工厂,简单工厂,产品。

2、应用场景

2.1、模板设计模式场景:我们操作数据库的dao层,对这些操作的封装成template,提供特定的增删改查方法。
2.2、抽象工厂设计模式场景: 最近比特币交易很多,用币来兑换人民币,我们用一个统一的接口,但是每一种虚拟币的兑
换率不同,就有这个抽象工厂创建不同的简单工厂负责一种兑换率

3、代码实现

      3.1、模板设计模式

public abstract class Account {

    //虚拟币兑换人民币
    public final double VtoRMB(int num){

        double rateData = rate();

        double result   = rateData * num;

        return result;
    }

    //抽象方法,每种虚拟币的抽象方法
    public abstract double rate();
}
public class BTCAccount extends Account {
    
    @Override
    public double rate() {
        return 500;
    }
}
public class ETCAccount extends Account {

    @Override
    public double rate() {
        //直接传值,具体的业务或者逻辑就不写了,写个大概,直接返回结果
        return 700;
    }
}
public class Main {

    public static void main(String[] args){

        Account accountBtc = new BTCAccount();

        double btcRmb      = accountBtc.VtoRMB(100);

        System.out.println("兑换一百个btc虚拟币,获得人民币:"+btcRmb+"元");


        Account accountEtc = new ETCAccount();

        double etcRmb      = accountEtc.VtoRMB(100);

        System.out.println("兑换一百个etc虚拟币,获得人民币:"+etcRmb+"元");
    }
}

      这个就是最简单的模板设计模式,理所当然,其他的模板设计模式的概念都是这样,只不过子类业务逻辑比较复杂,结果如下:

      兑换一百个btc虚拟币,获得人民币:50000.0元
      兑换一百个etc虚拟币,获得人民币:70000.0元

      3.2 抽象工厂设计模式

      看这图说明创建的类有些多,看代码就行啦,主要是直接上代码怕你们不清楚结构

public interface CellFuZhuang {
    void cellFuZhuang();
}
public class LiNing implements CellFuZhuang {
    @Override
    public void cellFuZhuang() {
        System.out.println("李宁专卖店,出售各种服装,衣服,鞋");
    }
}
public class SaiQi implements CellFuZhuang {
    @Override
    public void cellFuZhuang() {
        System.out.println("赛琪专卖店,卖各种运动");
    }
}
public interface CellJiaDian {
    void cellJiaDian();
}
public class SuNing implements CellJiaDian {
    @Override
    public void cellJiaDian() {
        System.out.println("苏宁,只卖家电");
    }
}
public class Dell implements CellJiaDian {
    @Override
    public void cellJiaDian() {
        System.out.println("戴尔,只卖家电");
    }
}
public abstract class TaobaoFactory {

    //这是一个一个抽象工厂类,要创建多个简单工厂

    //创建一个卖服装的工厂类
    abstract CellFuZhuang getFuZhuang(String name);

    //创建一个卖家电的工厂类
    abstract CellJiaDian getJiaDian(String name);
}
public class FuZhuangFactory extends TaobaoFactory{

    @Override
    CellFuZhuang getFuZhuang(String name) {

        if ("LiNing".equals(name)){
            return new LiNing();
        }
        if ("SaiQi".equals(name)){
            return new SaiQi();
        }
        return null;
    }

    @Override
    CellJiaDian getJiaDian(String name) {
        return null;
    }
}
public class JiaDianFactory extends TaobaoFactory{
    @Override
    CellFuZhuang getFuZhuang(String name) {

        return null;
    }

    @Override
    CellJiaDian getJiaDian(String name) {

            if ("SuNing".equals(name)){
                return new SuNing();
            }
            if ("Dell".equals(name)){
                return new Dell();
            }
            return null;
    }
}

      创建一个工厂创造器/生成器类

public class ProducerTaobao {

    public static TaobaoFactory getFactory(String choice){
        if(choice.equals("FuZhuang")){
            return new FuZhuangFactory();
        }
        if(choice.equals("JiaDian")){
            return new JiaDianFactory();
        }
        return null;
    }
}

      最后main执行

public class Main {

    public static void main(String[] args){

        TaobaoFactory taobaoFactory1 = ProducerTaobao.getFactory("FuZhuang");

        TaobaoFactory taobaoFactory2 = ProducerTaobao.getFactory("JiaDian");

        taobaoFactory1.getFuZhuang("LiNing").cellFuZhuang();
        taobaoFactory1.getFuZhuang("SaiQi").cellFuZhuang();

        taobaoFactory2.getJiaDian("SuNing").cellJiaDian();
        taobaoFactory2.getJiaDian("Dell").cellJiaDian();

    }
}

      结果:

李宁专卖店,出售各种服装,衣服,鞋
赛琪专卖店,卖各种运动
苏宁,只卖家电
戴尔,只卖家电
展开阅读全文
打赏
1
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
1
分享
返回顶部
顶部