简单工厂方法模式(别名:虚拟构造) 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.
类图
模式的结构与使用 工厂方法模式的结构中包括四个角色。
抽象产品(Product):抽象类或接口,负责定义具体产品必须实现的方法。
具体产品(Concrete Product):具体产品是一个类,如果Product是一个抽象类,那么具体产品是Product的子类;如果Product是一个接口,那么具体产品去实现接口。
构造者(Creator):一个接口或者抽象类。构造者负责定义一个称作工厂方法的抽象方法,该方法返回具体产品类的实例。
具体构造者(Concrete Creator):具体构造者重写工厂方法使该方法返回具体产品的实例。
简单的例子 Product的抽象类Animals.java 1
2
3
4
5
6
package virtualconstructor;
public abstract class Animals {
String name;
public abstract void move () ;
}
ConcreteProduct的实现类Dog.java 1
2
3
4
5
6
7
8
9
10
11
12
package virtualconstructor;
public class Dog extends Animals {
public Dog () {
name = "狗" ;
}
public void move () {
System.out.println(name + "是走" );
}
}
ConcreteProduct的实现类Cat.java 1
2
3
4
5
6
7
8
9
10
11
12
13
package virtualconstructor;
public class Cat extends Animals {
public Cat () {
name = "猫" ;
}
@Override
public void move () {
System.out.println(name + "是飞" );
}
}
Creator的抽象类Creator.java 1
2
3
4
5
6
package virtualconstructor;
public abstract class Creator {
Animals animal;
public abstract Animals getAnimal () ;
}
ConcreteCreator的实现类DogCreator.java 1
2
3
4
5
6
7
8
9
package virtualconstructor;
public class DogCreator extends Creator {
@Override
public Animals getAnimal () {
return new Dog();
}
}
ConcreteCreator的实现类CatCreator.java 1
2
3
4
5
6
7
8
9
package virtualconstructor;
public class CatCreator extends Creator {
@Override
public Animals getAnimal () {
return new Cat();
}
}
测试类Application.java 1
2
3
4
5
6
7
8
9
10
11
package virtualconstructor;
public class Application {
public static void main (String[] args) {
DogCreator dog = new DogCreator();
dog.getAnimal().move();
CatCreator cat = new CatCreator();
cat.getAnimal().move();
}
}
工厂模式的优点
使用工厂模式可以让用户的代码和某个特定类的子类的代码解耦。
工厂方法的使用用户不必知道它所使用的对象是怎么被创建的,只需要知道该对象有哪些方法即可。
适用工厂模式的情景
用户需要一个类的子类的实例,但不希望与该类的子类形成耦合。
用户需要一个类的子类的实例,但用户不知道该类有哪些子类可用。
下载源码请到 MyGitHub