工厂模式一章讲了很多内容,但是设计思想是一致的
1:变量不可以持有具体类的引用(如果使用new 就会持有具体类的引用,可以用工厂类避开)
2:不要让类派生自具体类(如果派生自具体类,那就是依赖具体的实现类,弹性差,请派生自抽象类或者接口)
3:不要覆盖基类中已实现的方法(如果覆盖基类已实现的方法,那基类就不是一个真正适合被继承的抽象,基类中已经实现的方法,应该有所有的子类共享)
本章的工厂模式也是基于上面的思想,分别出现了简单工厂方法(更像是编程习惯,不是我们定义的工厂模式),工厂模式,抽象工厂模式;
工厂模式引用的例子是pizza store的例子,我们在pizza store里面可以生产各种各样的pizza,如果我们在PizzaStore类里面直接new Pizza()对象的话,那如果每次更改菜单,推出新的口味的时候,都要更改PizzaStore类,跟我们想要的不一样,更何况,Pizza Store可以有加盟店,中国的Pizza Store和美国的Pizza Store可以有不同的pizza,那我们更难修改了。
工厂方法的定义:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
简单工厂方法,工厂模式,抽象工厂模式的区别
原始的类
class PizzaStore{
Pizza createPizza(String 口味){
if(口味==海鲜){
return new 海鲜Pizza;
}
if(口味==榴莲){
return new 榴莲Pizza;
}
if(口味==鸡肉){
return new 鸡肉Pizza;
}
throw new Exception("面团给你,你来做");
}
}
我们一开始的Pizza Store是上面这种,但是不久就被客户投诉口味太少(服务态度太差).需要整改,我们可以做一些牛肉口味、烤肉口味、水果口味的pizza,那我们修改一下PizzaStore的createPizza方法,下次我们发现榴莲Pizza没人喜欢,我们要撤掉,那还要再修改PizzaStore,更要命的来了,福兰人民很喜欢吃Pizza。要加盟我们的pizzaStore,但是我们的Pizza口味都太淡了,不够辣,要加辣,加变态辣。这个时候我们要怎么办呢。
简单工厂方法:
我们会定义一个类来专门生产pizza
class PizzaFactory{
Pizza createPizza(String 口味){
if(){}
if(){}
if(){}
}
}
class PizzaStore{
PizzaFactory factory;
Pizza createPizza(String 口味){
return factory.createPizza(口味);
}
}
工厂模式:定义一个抽象类,让子类来具体实现具体实例化哪个类
abstract PizzaFactory{
abstract Pizza createPizza(String 口味);
}
class 广州的PizzaFacatory extends PizzaFactory(){
Pizza createPizza(String 口味){
if(){}
if(){}
if(){}
}
}
class 福兰的PizzaFactory extends PizzaFactory(){
Pizza createPizza(String 口味){
if(){return new 辣的pizza};
if(){return new 超级辣的Pizza};
if(){return new 变态辣的Pizza};
}
}
我们的广州和福兰的PizzaStore就不用改变自己,只要依赖不同的PizzaFactory就好了;而且,我们还可以把pizzaStore里面的收银方法设置成final,强制全国内的pizzaStore收银全部进入公司统一账户。
抽象工厂模式:
PizzaStore越开越多,公司也越来越大,但是顾客投诉,在山东吃的pizza一个两斤,在上海吃变成了一斤八两,小了二两吃不饱,公司查看原因,发现上海的pizzaStore的原料供应商擅自把面饼调小了一部分,公司决定统一pizza的尺寸,重量,甚至用料,统一由一个原料生产商提供,而不是pizzaStore自己采购,这样就做到全国统一标准。
class interface 原料factory(){
面饼 create面饼();
海鲜 create海鲜();
用油 create用油();
包装盒 create包装盒();
}
然后招投标了一家公司,合理的价格生产我们的原料。实现了统一标准,这个时候我们用到的接口和生产了一个产品组就是我们的抽象工厂模式,
其实我们看到,简单工厂方法,工厂模式,抽象工厂模式之间差别还是很大的,也是因为我们的pizzaStore一步一步发展起来不断改良的结果。