精通Java设计模式从初见到相爱之模版设计模式和抽象工厂设计模式(5)

序言:说一下为什么一下子讲这两个设计模式,因为本人觉得他们有异曲同工之妙,不文字叙说了,说那么多官方话大家也听不懂,一会看代码注释大家就明白了

1、概念

    1.1 模版设计模式概念:项目中我们经常用到,jedisTemplate,StringJedisTemplate等等都有一些增删改差操作,他们就是封装的工具类,操作数据库增删改查,这就是模板设计模式的理念,少重复写代码了

    1.2 抽象工厂模式:先说一下简单工厂,我的理解就是相当于淘宝,天猫,京东的一个小店铺一样,这个店铺就相当于一个简单工厂,这个店铺提供上衣,裤子等等,对于抽象工厂,他就是京东或者淘宝,它提供众多的店铺,这就是他的概念。

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

2、应用场景

    2.1 模板设计模式场景:

        2.11 我们操作数据库的dao层,对这些操作的封装成template,提供特定的增删改查方法

    2.2 抽象工厂设计模式场景:

        2.21  最近比特币交易很多,用币来兑换人民币,我们用一个统一的接口,但是每一种虚拟币的兑换率不同,就有这个抽象工厂创建不同的简单工厂负责一种兑换率

 

3、代码实现:

    3.1 模板设计模式

package template;

public abstract class Account {

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

        double rateData = rate();

        double result   = rateData * num;

        return result;
    }

    //抽象方法,每种虚拟币的抽象方法
    public abstract double rate();
}
package template;

public class BTCAccount extends Account {
    
    @Override
    public double rate() {
        return 500;
    }
}
package template;

public class ETCAccount extends Account {

    @Override
    public double rate() {

        //直接传值,具体的业务或者逻辑就不写了,写个大概,直接返回结果
        return 700;
    }
}
package template;

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 抽象工厂设计模式

精通Java设计模式从初见到相爱之模版设计模式和抽象工厂设计模式(5)

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

package abstractFactory;

public interface CellFuZhuang {

    void cellFuZhuang();
}
package abstractFactory;

public class LiNing implements CellFuZhuang {

    @Override
    public void cellFuZhuang() {
        System.out.println("李宁专卖店,出售各种服装,衣服,鞋");
    }
}
package abstractFactory;

public class SaiQi implements CellFuZhuang {
    @Override
    public void cellFuZhuang() {
        System.out.println("赛琪专卖店,卖各种运动");
    }
}

 

package abstractFactory;

public interface CellJiaDian {

    void cellJiaDian();
}
package abstractFactory;

public class SuNing implements CellJiaDian {
    @Override
    public void cellJiaDian() {
        System.out.println("苏宁,只卖家电");
    }
}
package abstractFactory;

public class Dell implements CellJiaDian {
    @Override
    public void cellJiaDian() {
        System.out.println("戴尔,只卖家电");
    }
}

 

package abstractFactory;

public abstract class TaobaoFactory {

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

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

    //创建一个卖家电的工厂类
    abstract CellJiaDian getJiaDian(String name);
}
package abstractFactory;

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;
    }
}
package abstractFactory;

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;
    }
}

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

package abstractFactory;

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执行

package abstractFactory;

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();

    }
}

结果:

李宁专卖店,出售各种服装,衣服,鞋
赛琪专卖店,卖各种运动
苏宁,只卖家电
戴尔,只卖家电

 

    

 

    

转载于:https://my.oschina.net/mdxlcj/blog/1794088