简单工厂模式的Java实现

引入

当创建了一个类的对象之后,这个对象就依赖这个类了。如果修改了该类,那么就需要修改所有与该对象有关的操作。
因此,简单工厂模式要解决的问题是:对象不能应对类的变化
解决的思路是:封装变化点,哪里变化就封装哪里。在这个例子中,要实例化的类变了,就将实例化这个操作封装起来,我们可以创建一个专门负责根据条件,创建具体类的实例的类,也就是下面要说的简单工厂模式。


简单工厂模式

  • 定义:
    专门定义一个工厂类,负责创建其他类的实例,要被实例化的类通常具有相同的父类或接口。简单工厂模式又称为静态工厂方法(Static Factory Method)模式,属于类的创建型模式
  • 意图:
    提供一个工厂类,工厂类负责根据不同的条件(参数)创建不同的类的实例
  • 参与者:
    • 工厂角色:
      是简单工厂模式的核心,它负责创建具体产品类的实例。工厂类可以被外界直接调用
    • 抽象产品角色:
      是所有具体产品角色的父类,它负责描述所有实例所共有的公共接口
    • 具体产品角色:
      继承自抽象产品角色,一般有多个,是简单工厂模式的创建目标
  • UML图 aaaaa

Java实现

IAnimal.java:

public interface IAnimal {  
    public void say();
}

Cat.java:

public class Cat implements IAnimal {  
    public void say(){
        System.out.println("miao");
    }
}

Dog.java:

public class Dog implements IAnimal {  
    public void say(){
        System.out.println("wang");
    }
}

SimpleFactory.java:

public class SimpleFactory {  
    private IAnimal animal;

    public SimpleFactory(String animalType) 
        throws ClassNotFoundException, InstantiationException,
              IllegalAccessException, ClassCastException {
        Class<?> cls = Class.forName(animalType);
        animal = (IAnimal)cls.newInstance();
    }

    public IAnimal getAnimal() {
        return this.animal;
    }
}

Main.java:

public class Main {  
    public static void main(String[] args) throws Exception {
        IAnimal cat = (new SimpleFactory("Cat")).getAnimal();
        cat.say(); 

        IAnimal dog = (new SimpleFactory("Dog")).getAnimal();
        dog.say(); 
    }
}

编译:

$javac IAnimal.java
$javac Cat.java
$javac Dog.java
$javac SimpleFactory.java
$javac Main.java

运行:

$java Main
miao  
wang  

感谢浏览tim chow的作品!

如果您喜欢,可以分享到: 更多

如果您有任何疑问或想要与tim chow进行交流

可点此给tim chow发信

如有问题,也可在下面留言: