精通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 抽象工厂设计模式
看这图说明创建的类有些多,,,看代码就行啦,主要是直接上代码怕你们不清楚结构
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