简介:简单工厂模式又叫静态工厂方法模式,它定义一个具体的工厂类来负责创建一些类的实例,而这些被创建的类有一个共同的父类,这样就可以实现面向抽象而不是面向具体编程。
组成:工厂类、抽象类和实现抽象类的具体类。
下面我们以创建动物园的动物为类实现一个简单工厂模式。
首先,我们创建一个动物的公共接口
package my.pattern.simplefactory;
//创建动物类的接口
public interface Animal {
//创建公共方法
public void eat();
}
然后依次实现老虎、海豚和鹦鹉的具体类
package my.pattern.simplefactory;
//创建老虎类,实现animal借口方法
public class Tiger implements Animal {
//实现公共方法
public void eat() {
System.out.println("老虎会吃");
}
//子类特有方法
public void run(){
System.out.println("老虎会跑");
}
}
package my.pattern.simplefactory;
//创建海豚类,实现Animal的方法
public class Dolphin implements Animal{
//实现公共方法
public void eat (){
System.out.println("海豚会吃");
}
//私有方法
public void swim(){
System.out.println("海豚会游泳");
}
}
package my.pattern.simplefactory;
//创建鹦鹉类,实现Animal的方法
public class Parrot implements Animal{
//实现公共方法
public void eat(){
System.out.println("鹦鹉会吃");
}
//实现私有方法
public void fly(){
System.out.println("鹦鹉会飞");
}
}
然后,创建工厂类。
package my.pattern.simplefactory;
//创建工厂类
public class AnimalFactory {
public static Animal Factory(String animal){
if("Tiger".equals(animal)){
return new Tiger();
}
else if("Dolphin".equals(animal)){
return new Dolphin();
}
else if("Parrot".equals(animal)){
return new Parrot();
}
return null;
}
}
最后,在客户端实现。
package my.pattern.simplefactory;
public class Client {
//实现方法
public static void main(String[] args) {
Animal animal = AnimalFactory.Factory("Tiger");
animal.eat();
animal = AnimalFactory.Factory("Dolphin");
animal.eat();
animal = AnimalFactory.Factory("Parrot");
animal.eat();
}
}
这样我们就实现了简单工厂模式。
优点:在简单工厂模式中,客户端不再负责对象的创建,而是把这个责任丢给具体的工厂类,客户端只负责对对象的调用,从而明确了各个类的职责。
缺点:由于简单工厂模式使用静态方法来创建对象,这就导致静态方法无法被继承。另一方面,这个工厂类负责所有对象的创建,这会导致虽然具体产品的不断增多,可能客户端对于某些产品的创建方式会有不同的要求,这样的话,就要不断的修改工厂类,增加相应的判断逻辑,不利于后期维护。
深入探讨:对于工厂类我们可以使用JAVA的反射机制进行优化。如下:
public static Animal factory(String animal) throws ClassNotFoundException, InstantiationException, IllegalAccessException{
Class ani = Class.forName(animal);
return (Animal)ani.newInstance();
}