(本篇博客已于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(); } }
结果:
李宁专卖店,出售各种服装,衣服,鞋 赛琪专卖店,卖各种运动 苏宁,只卖家电 戴尔,只卖家电