上一篇讲到简单工厂模式,比如某一天蛋糕店中增加了冰激凌口味的,如果还是使用简单工厂模式的话,代码如下:
public interface Cake {
void display();
}
public class FruitCake implements Cake{
public void display() {
System.out.println("thie is a fruit cake");
}
}
public class MousseCake implements Cake{
public void display() {
System.out.println("this is a MousseCake");
}
}
public class iceCreamCake implements Cake{
public void display() {
System.out.println("this is a iceCreamCake");
}
}
public class CakeFactory {
private static Map<String,Cake> cakeMap = new HashMap();
static {
cakeMap.put("fruit",new FruitCake());
cakeMap.put("mousse",new MousseCake());
cakeMap.put("icecream",new iceCreamCake());
}
public static Cake buyCake(String type){
return cakeMap.get(type.toLowerCase());
}
}
public class Lisi {
public static void main(String agrs[]){
CakeFactory.buyCake("fruit").display();
CakeFactory.buyCake("mousse").display();
CakeFactory.buyCake("icecream").display();
}
}
也就是每次新加口味的蛋糕,我们都需要针对蛋糕工厂进行修改,这就增加了系统的复杂性,同时违背的开闭原则,在蛋糕多到一定程度时,自然而然的就会考虑到,是否可以对工厂进行抽象,不同的产品使用不同的工厂生产,李四想要买慕斯蛋糕时,只需要去慕斯蛋糕的工厂即可,想要买水果蛋糕,则去水果蛋糕工厂。
系统角色演化为:
1)蛋糕(接口)
2)水果蛋糕(实现类)
3)慕斯蛋糕(实现类)
4)冰激凌蛋糕(实现类)
5)工厂(接口)
6)水果蛋糕工厂(实现类)
7)慕斯蛋糕(实现类)
8)冰激凌蛋糕(实现类)
9)李四(消费者)
代码如下:
public interface Cake {
void display();
}
public class FruitCake implements Cake{
public void display() {
System.out.println("thie is a fruit cake");
}
}
public class MousseCake implements Cake{
public void display() {
System.out.println("this is a MousseCake");
}
}
public class iceCreamCake implements Cake{
public void display() {
System.out.println("this is a iceCreamCake");
}
}
public interface CakeFactory {
void buyCake();
}
/**
* 专门制造销售水果蛋糕的工厂
*/
public class FruitCakeFactory implements CakeFactory{
public void buy() {
new FruitCake().display();
}
}
/**
* 专门制造慕斯蛋糕的工厂
*/
public class MousseCakeFactory implements CakeFactory{
public void buy() {
new MousseCake().display();
}
}
/**
* 制造冰激凌蛋糕的工厂
*/
public class IcecreamCakeFactory implements CakeFactory{
public void buy() {
new IcecreamCake().display();
}
}
public class Lisi {
public static void main(String agrs[]){
CakeFactory fruitCakeFactory = new FruitCakeFactory();
fruitCakeFactory.buy();
CakeFactory mousseCakeFactory = new MousseCakeFactory();
mousseCakeFactory.buy();
CakeFactory icecreamCakeFactory = new IcecreamCakeFactory();
icecreamCakeFactory.buy();
}
}
运行结果:
this is a fruit cake
this is a MousseCake
this is a IcecreamCake