工厂模式
简单工厂模式
其实就是把建造功能集合在一个方法里面,通过传入参数去判断需要建造哪种对象返回。当然这些对象都有共同的父类。如下,cat和dog的父类就是animal,有一个共同的方法是eat()
class Animal{
public void eat(){
Syttem.out.prinln('eat');
}
}
class Cat extend Animal{
@override
public void eat(){
Syttem.out.prinln('cat eat');
}
}
class Dog extend Animal{
@override
public void eat(){
Syttem.out.prinln('Dog eat');
}
}
public Animal create_factory(String type){
if (type == 'cat'){
return Cat()
}
else if (type == 'dog'){
return Dog()
}
}
然后调用代码:
Animal client = create_factory('cat')
client.eat()
定一个抽象类,具体的实现交给子类,工厂类的方法根据类型返回不同的对象。
这种方式有以下缺点:
- 由于工厂类集中了所有产品创建逻辑,违反了高内聚责任分配原则,一旦不能正常工作,整个系统都要受到影响。
- 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
工厂方法模式
定义一个工厂接口,具体的实现交给工厂子类。还是上面的例子,Animal,Cat,Dog这些我们还是不变,但是工厂类要修改一下了
interface IFactory{
public Animal create();
}
class CatFactory implements IFactory{
public Animal create(){
return new Cat();
}
}
class DogFactory implements IFactory{
public Animal create(){
return new Dog();
}
}
这里我们多实现了两个工厂类,分别用来创建Cat和Dog,这时候我们的调用代码就是这样了:
IFactory factory = new CatFactory();
Animal animal = factory.create()
animal.eat()
这就有人问了,你这不是找事吗?这明明就是代码量增加了,而且我如果要增加一个Fish对象,我得写一个Fish,一个FishFactory,而且在客户调用的地方还得根据需求更改代码。
我们来看看他的优点:
简单工厂方式,一旦我们增加新功能,我们就需要在工厂类里面就行修改,这违反了开放封闭原则。而工厂方法模式,我们不需要修改工厂类,只需要增加对应的功能和工厂类即可,这样整个工厂和产品体系都没有修改的变化,而只是扩展的变化,完全符合开放-闭合原则的精神。
其实工厂方法就是把简单工厂的内部逻辑判断移到了客户端代码来进行。你想要加功能,本来是改工厂类的,而现在是修改客户端。