——-三人行 必有我师
说到设计的模式,当来离不开我们的工厂了是不是,来,让我们看看康师傅的泡面工厂.做泡面,有很多种类是不是,我们这简单点,就说两种吧,酸菜和牛肉的.做泡面有很多流程,其中和面,油炸,还有最重要的调料包是少不了的,所以我们把这三样做成个接口,做泡面都要实现它
public interface Paomian {
void hemian(); //和面
void youzha(); //油炸
void tiaoliaopao(); //调料包
}
然后我们该开始决定具体怎么做泡面了,老坛酸菜这样做
public class LtscPaomian implements Paomian{ //老坛酸菜
public void hemian() {
// TODO Auto-generated method stub
}
public void youzha() {
// TODO Auto-generated method stub
}
public void tiaoliaopao() {
// TODO Auto-generated method stub
System.out.println("没胃口,吃吃酸菜");
}
}
牛肉味的这样做
public class NrwPaomian implements Paomian{ //牛肉味
public void hemian() {
// TODO Auto-generated method stub
}
public void youzha() {
// TODO Auto-generated method stub
}
public void tiaoliaopao() {
// TODO Auto-generated method stub
System.out.println("一种感觉不像肉的东西");
}
}
好了,规定好了怎么做,我们就要开始做了.但是我们肯定不是单独做啊,这销量我们要有个工厂是不是
public class KsfFactory { //康师傅工厂
public Paomian getPaomian(String type){
if("LtscPaomian".equals(type)){
return new LtscPaomian();
}else if("NrwPaomian".equals(type)){
return new NrwPaomian();
}else{
throw new IllegalArgumentException("参数错误");
}
}
}
这叫普通工厂,你要什么类型泡面,我就给你什么泡面,来看看测试
public static void main(String[] args) {
// TODO Auto-generated method stub
(new KsfFactory()).getPaomian("LtscPaomian").tiaoliaopao();
(new KsfFactory()).getPaomian("NrwPaomian").tiaoliaopao();
}
输出
没胃口,吃吃酸菜
一种感觉不像肉的东西
但是像这样子的 普通工厂 我们有时候会填错参数的,所以 多方法工厂 就出现了
public class KsfFactory { //康师傅工厂
public Paomian productLtsc(){ //制作老坛酸菜泡面
return new LtscPaomian();
}
public Paomian productNrw(){
return new LtscPaomian();
}
}
这样子还是有点不好是不是,因为我们要个泡面我们还要去new个工厂,所以我们也不会这么写.所以我们平常用的更多是静态工厂方法模式
public class KsfFactory { //康师傅工厂
public static Paomian productLtsc(){ //制作老坛酸菜泡面
return new LtscPaomian();
}
public static Paomian productNrw(){
return new LtscPaomian();
}
}
这个样子就是我们常用的状态了.最后说下抽象工厂模式,我们这样的屁民去买泡面,现在就差不多就两个选择吧,统一和康师傅,当然还有一些存在,基本都是这两家了.它们都有做泡面,但肯定做的不一样是吧.材料之类的等肯定做不到一样的.所以这时候抽象工厂模式就出场了,我们定义一个做泡面的抽象工厂
public abstract class MakePaomianFactory {
public abstract Paomian getLtscPaomian();
public abstract Paomian getNrwPaomian();
}
康师傅工厂
public class KsfFactory extends MakePaomianFactory{ //康师傅工厂
public Paomian getLtscPaomian() {
// TODO Auto-generated method stub
return new KsfLtsc();
}
public Paomian getNrwPaomian() {
// TODO Auto-generated method stub
return KsfNrw();
}
}
统一工厂
public class TyFactory extends MakePaomianFactory{ //统一工厂
public Paomian getLtscPaomian() {
// TODO Auto-generated method stub
return TyLtsc();
}
public Paomian getNrwPaomian() {
// TODO Auto-generated method stub
return TyNrw();
}
}
这个时候,吃那个牌子就由你自己来决定了是不是. 这样子虽然不是静态方法,但是我们可以把我们的工厂做成单例也差不多效果是吧.