浅谈设计模式——简单工厂模式

来源:互联网 发布:我的世界手机版js天堂 编辑:程序博客网 时间:2024/05/13 04:26

简介:简单工厂模式又叫静态工厂方法模式,它定义一个具体的工厂类来负责创建一些类的实例,而这些被创建的类有一个共同的父类,这样就可以实现面向抽象而不是面向具体编程。

组成:工厂类、抽象类和实现抽象类的具体类。

 

下面我们以创建动物园的动物为类实现一个简单工厂模式。

首先,我们创建一个动物的公共接口

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();
 }

原创粉丝点击