Java常用的工厂模式有哪些?
1 个回答
工厂模式是 Java 中最常用的设计模式之一,属于创建型模式。主要是为新创建的对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。工厂模式在《Java 与模式》中分为三类:
- 简单工厂模式(Simple Factory)
- 工厂方法模式(Factory Method)
- 抽象工厂模式(Abstract Factory)
而GOF 在《设计模式》一书中将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。
工厂模式
步骤一:创建一个接口
public interface Animal {
void shout();
}
步骤二:创建实现Animal接口的实体类。
public class Cat implements Animal {
@Override
public void shout() {
System.out.println("Cat::shout() method.");
}
}
public class Dog implements Animal {
@Override
public void shout() {
System.out.println("Dog::shout() method.");
}
}
步骤三:创建一个工厂
public class AnimalFactory {
// 使用 getAnimal 方法获取类型的对象
public Animal getAnimal (String type) {
if (type == null) {
return null;
}
if ("CAT".equalsIgnoreCase(type)) {
return new Cat();
} else if ("DOG".equalsIgnoreCase(type)) {
return new Dog();
}
return null;
}
}
步骤四:测试
public class AnimalDemo {
public static void main(String[] args) {
AnimalFactory animalFactory = new AnimalFactory();
// 获取 Cat 的对象,并调用它的 shout 方法
Animal catAnimal = animalFactory.getAnimal("CAT");
// 输出:Cat::shout() method.
catAnimal.shout();
// 获取 Dog 的对象,并调用它的 shout 方法
Animal dogAnimal = animalFactory.getAnimal("DOG");
// 输出:Dog::shout() method.
dogAnimal.shout();
}
}
抽象工厂
步骤一:创建一个接口
public interface Animal {
void shout();
}
步骤二:创建实现Animal接口的实体类。
public class Cat implements Animal {
@Override
public void shout() {
System.out.println("Cat::shout() method.");
}
}
public class Dog implements Animal {
@Override
public void shout() {
System.out.println("Dog::shout() method.");
}
}
步骤三:为 Animal 对象创建抽象类来获取工厂。
public abstract class AbstractFactory {
public abstract Animal getAnimal (String type) ;
// 如果需要获取其他例如颜色,形状等,参照抽象工厂实例copy
// public abstract Color getColor (String colorType) ;
}
步骤四:创建一个工厂
public class AnimalFactory extends AbstractFactory {
@Override
public Animal getAnimal (String type) {
if (type == null) {
return null;
}
if ("CAT".equalsIgnoreCase(type)) {
return new Cat();
} else if ("DOG".equalsIgnoreCase(type)) {
return new Dog();
}
return null;
}
}
步骤五:创建一个工厂生成器类获取工厂。
public class FactoryProducer {
public static AbstractFactory getAnimalFactory () {
return new AnimalFactory();
}
}
步骤六:测试
public class AnimalDemo {
public static void main(String[] args) {
AbstractFactory animalFactory = FactoryProducer.getAnimalFactory();
// 获取 Cat 的对象,并调用它的 shout 方法
Animal catAnimal = animalFactory.getAnimal("CAT");
// 输出:Cat::shout() method.
catAnimal.shout();
// 获取 Dog 的对象,并调用它的 shout 方法
Animal dogAnimal = animalFactory.getAnimal("DOG");
// 输出:Dog::shout() method.
dogAnimal.shout();
}
}