大白话 设计模式之虚拟工厂
什么是设计模式
现在聊起来java设计,那就必然要聊聊设计模式,几年前我刚入行的时候,总是听人说起设计模式,在当时的我看来,那是多么高大上的东西啊,以至于有种遥不可及的感觉,如今自己做java也好几个年头了,今天来谈谈如今我眼中的设计模式
说白了,设计模式就是前辈高人总结出来的一套编写好代码的方法,就好比是面向对象的武林秘籍,凡夫俗子如果能够运用自如也立马能够成为武林高手.
那什么又是虚拟工厂呢?
在聊虚拟工厂之前,我们先举个例子:
我们把汉堡快餐店抽象到面向对象的世界里,那我们要怎么做呢? 首先我们建造一个快餐店的模型,我们可以在快餐店里点汉堡,点饮料
public interface FastFoodStore {
/**点汉堡 */
Hamburger orderHamburger();
/**点饮料 */
Drink orderDrink();
}
有了快餐店,我们不能忘记最重要的东西--食物, 于是我们有了汉堡和饮料的模型:
public interface Drink {
/** */
public void desc();
}
public interface Hamburger {
/** */
void desc();
}
那么你喜欢吃哪家快餐呢? 我们有很多种选择,比如说KFC,
public class KFC implements FastFoodStore {
/**点KFC的汉堡 */
public Hamburger orderHamburger() {
return new KFCHamburger();
}
/**点KFC的饮料 */
public Drink orderDrink() {
return new KFCDrink();
}
}
比如说McDonald:
public class Mcdonald implements FastFoodStore {
/**点McDonald汉堡 */
public Hamburger orderHamburger() {
return new McHamburger();
}
/**点McDonald饮料 */
public Drink orderDrink() {
return new McDrink();
}
}
当然每个店的口味可不一样,对于KFC,它有自己的汉堡和饮料:
public class KFCDrink implements Drink {
/** */
public void desc() {
System.out.println("KFC饮料");
}
}
public class KFCHamburger implements Hamburger {
/** */
public void desc() {
System.out.println("KFC汉堡");
}
}
McDonald 也一样:
public class McDrink implements Drink {
/** */
public void desc() {
System.out.println("Mcdonald饮料");
}
}
public class McHamburger implements Hamburger {
/** */
public void desc() {
System.out.println("McDonald汉堡");
}
}
纠结了半天,我打算两家都吃一遍:
public static void main(String[] args) {
FastFoodStore food ;
Hamburger hamburger;
Drink drink;
//先去KFC
food = new KFC();
//点餐
hamburger = food.orderHamburger();
drink = food.orderDrink();
//看看卖相怎么样
hamburger.desc();
drink.desc();
//再去McDonald
food = new Mcdonald();
//点餐
hamburger = food.orderHamburger();
drink = food.orderDrink();
//再看看怎么样
hamburger.desc();
drink.desc();
}
结果
KFC汉堡
KFC饮料
McDonald汉堡
Mcdonald饮料
其实这就是抽象工厂,引用专业的定义就是 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类