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