abstract应用之设计模式

工厂模式

应用场景:1点点全国连锁,每个地方的每个店里面的奶茶种类基本相同。假设以红茶玛奇朵、红茶拿铁和金桔柠檬三种奶茶为例,每个1点点店里都会制作这三种奶茶。

  1. 简单工厂设计模式

    一位顾客想去1点点奶茶店(ALittleBit抽象父类)买一杯奶茶,这时他会根据奶茶种类(BlackTeaMacchiato、BlackTeaLatte、KumquatLemon)选择奶茶,1点点店铺(ALittleBitFactory)就会按照顾客要求生产制作这种奶茶。最后ALittleBitTest将送到顾客手(客户端ALittleBitTest)中。

//抽象父类
package com.gem.demo.day0729;

public abstract class ALittleBit {
	public abstract String getName();
}

//子类继承抽象父类  重写抽象方法
public class BlackTeaMacchiato extends ALittleBit {

	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return "红茶玛奇朵";
	}
}

public class BlackTeaLatte extends ALittleBit {

	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return "红茶拿铁";
	}
}

public class KumquatLemon extends ALittleBit {

	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return "金桔柠檬";
	}
}


//创建工厂ALittleBitFactory
public class ALittleBitFactory {
	public static final int MACCHIATO = 1;
	public static final int LATTE = 2;
	public static final int KUMQUATL = 3;

	public static ALittleBit createInstance(int type) {
		ALittleBit aLittleBit = null;
		if (type == MACCHIATO) {
			aLittleBit = new BlackTeaMacchiato();
		} else if (type == LATTE) {
			aLittleBit = new BlackTeaLatte();
		} else if (type == KUMQUATL) {
			aLittleBit = new KumquatLemon();
		} else {
			System.out.println("你类型有问题!");
		}
		return aLittleBit;
	}

}

//测试客户端ALittleBitTest
package com.gem.demo.day0729;

import static com.gem.demo.day0729.ALittleBitFactory.KUMQUATL;
import static com.gem.demo.day0729.ALittleBitFactory.createInstance;

public class ALittleBitTest {
	public static void main(String[] args) {
		ALittleBit aLittleBit = createInstance(KUMQUATL);
		System.out.println(aLittleBit.getName());
	}
}

注意:
- 在工厂ALittleBitFactory中createInstance()方法需要写成static
- 在测试ALittleBitTest中要导入static包

  1. 工厂方法设计模式
    (父类还是抽象父类,子类继承抽象父类并重写抽象方法)
    有一天,顾客身在异地,他想去1点点奶茶店买奶茶。由于每个地区的口味不一样,可能武汉店(WuHan)和苏州店(SuZhou)制作的不同种奶茶,他可能买不到自己想要的那种奶茶。因此会产生1点点店铺(ALittleBitFactory抽象父类)在每个地区生产制作不同种类奶茶的情况。
//工厂抽象父类
public abstract class ALittleBitFactory {

	public abstract ALittleBit[] createALittleBits();
}

//子类继承抽象父类并重写抽象方法
public class WuHan extends ALittleBitFactory {

	@Override
	public ALittleBit[] createALittleBits() {
		// TODO Auto-generated method stub
		return new ALittleBit[] { new BlackTeaMacchiato(), new BlackTeaLatte(), new KumquatLemon() };
	}

}

public class SuZhou extends ALittleBitFactory {

	@Override
	public ALittleBit[] createALittleBits() {
		// TODO Auto-generated method stub
		return new ALittleBit[] { new BlackTeaLatte() };
	}

}

//测试客户端ALittleBitTest
public class ALittleBitTest {
	public static void main(String[] args) {
		ALittleBitFactory factory = new WuHan();
		ALittleBit[] alitttelbirs = factory.createALittleBits();
		//System.out.println(alitttelbirs);
		//不能直接输出,否则会输出包名.类名.哈希码
		for (ALittleBit alitttelbir : alitttelbirs) {
			System.out.println(alitttelbir.getName());
		}
	}
}
  1. 抽象工厂模式
继承抽象父类
继承抽象父类
继承
继承
包含抽象方法
包含抽象方法
重写
重写
重写
重写
制作Tea和Coffee
1点点总公司
Tea
Coffee
零售店
武汉分店
苏州分店
顾客
//ALittleBit抽象父类(1点点总公司)
package com.gem.demo.day0729;

public abstract class ALittleBit {
	public abstract String getName();
}

//抽象子类(Tea和Coffee)
public abstract class Tea extends ALittleBit {

}
public abstract class Coffee extends ALittleBit {

}

//具体子类(Tea的种类和Coffee的种类)
public class BlackTeaLatte extends Coffee {

	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return "红茶拿铁";
	}
}

public class JasmineGreenTea extends Tea {

	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return "茉莉绿茶";
	}
}

public class KumquatLemon extends Tea {

	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return "金桔柠檬";
	}
}

public class SeasonsTea extends Tea {

	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return "四季春茶";
	}

}


//ALittleBitFactory零售店抽象父类
public abstract class ALittleBitFactory {

	public abstract Tea[] createTea();

	public abstract Coffee createCoffe();
}

//具体子类(武汉分店WuHan、苏州分店SuZhou)
public class WuHan extends ALittleBitFactory {

	@Override
	public Tea[] createTea() {
		// TODO Auto-generated method stub
		return new Tea[] { new JasmineGreenTea(), new SeasonsTea(), new KumquatLemon() };
	}

	@Override
	public Coffee createCoffe() {
		// TODO Auto-generated method stub
		return new BlackTeaLatte();
	}

}

public class SuZhou extends ALittleBitFactory {

	@Override
	public Tea[] createTea() {
		// TODO Auto-generated method stub
		return new Tea[] { new JasmineGreenTea(), new SeasonsTea(), new KumquatLemon() };
	}

	@Override
	public Coffee createCoffe() {
		// TODO Auto-generated method stub
		System.out.println("这边没有咖啡!");
		return null;
	}

}
//测试类(顾客)
public class ALittleBitTest {
	public static void main(String[] args) {
		ALittleBitFactory factory = new SuZhou();
		System.out.println("苏州卖茶的种类:");
		Tea[] teas = factory.createTea();
		for (Tea tea : teas) {
			System.out.println(tea.getName());
		}
		System.out.println("苏州卖咖啡的种类:");
		Coffee coffee = factory.createCoffe();
		System.out.println(coffee.getName());
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值