工厂方法模式
一、 为什么要使用工厂方法模式
上一期我们讲解了简单工厂模式,但是简单工厂模式的缺点如下:
简单工厂模式把生产对象的功能放在一个类上,如果是在添加一个新种类,必然会导致工厂类的修改,在实际开发中写好的类一般不允许打开修改。只允许在
原来的基础上添加类。因此要使用工厂方法模式进行改进。
二、工厂方法模式概述
工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给抽象工厂的子类去做。
三、工厂方法模式具体实现步骤(创建动物为例)
第1步、创建接口Animal
public interface Animal {
public void eat();
}
第2步、创建一个实现类Cat、Dog
public class Cat implements Animal {
public void eat() {
System.out.println("猫吃鱼");
}
}
public class Dog implements Animal {
public void eat() {
System.out.println("狗吃骨头");
}
}
第3步、之前设计的简单工厂模式如下:
public class AnimalFactory {
public static Animal createAnimal (String type){ Animal animal =null;//声明一个父类对象
//根据参数判断有生产什么对象
if ("cat".equals(type)) {
animal =new Cat();
}else if ("bus".equals(type)) {
animal =new Dog();
}
return animal;
}
}
这种实现把生产对象的功能放在一个AnimalFactory 类上,如果是在添加一个新的的种类Tiger,必然会引起AnimalFactory内部的修改。这就违反了面向对象的设计原则——开闭原则。使用工厂方法模式改进如下:
1、把AnimalFactory 进一步抽象写成一个接口,AnimalFactory 中创建动物的方法是抽象方法。这个时候可以把AnimalFactory 理解一个大厂,这个大厂只是规定要要生产动物,但是不具体生产。
接口:AnimalFactory
public interface AnimalFactory {
public Animal createAnimal();
}
2、生产不同的动物建可以立不同的具体工厂比如CatFactory ,就相当于在大厂的基础上建立不同的分厂,每个分厂生产不同的产品
建立生产猫的分厂类CatFactory
public class CatFactory implements AnimalFactory {
public Animal createAnimal() {
// TODO Auto-generated method stub
return new Cat();
}
}
建立生产狗的分厂类DogFactory
public class DogFactory implements AnimalFactory {
public Animal createAnimal() {
return new Dog();
}
}
以上的好处:如果需要创建一个新的对象Tiger,只要添加一个Tiger类和一个创建Tiger的分厂类。不要修改任何代码。
public class Test {
public static void main(String[] args) {
//要想创建猫,首先创建猫工厂,在生产猫对象
//创建猫工厂
AnimalFactory animalFactory=new CatFactory();
//创建猫
Animal cat=animalFactory.createAnimal();
cat.eat();
}
}
四、工厂方法模式的缺点
使用工厂方法模式创建新的动物种类的时候,不要修改任何代码,只需要添加类。但是我们发现当动物的种类非常多时,会出现大量的与之对应的工厂对象,增加的很多的代码。这不是我们所希望的,因此下期继续改进。
|
|