您的浏览器过于古老 & 陈旧。为了更好的访问体验, 请 升级你的浏览器
搁浅 发布于2019年10月14日 15:26 最近更新于 2019年10月14日 15:27

Java常用的工厂模式有哪些?

2509 次浏览 读完需要≈ 1 分钟 Java
有没有哪位大神告知常用的工厂模式还有之间区别。

1 个回答

一纸荒年 · 5年前

工厂模式是 Java 中最常用的设计模式之一,属于创建型模式。主要是为新创建的对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。工厂模式在《Java 与模式》中分为三类:

  1. 简单工厂模式(Simple Factory)
  2. 工厂方法模式(Factory Method)
  3. 抽象工厂模式(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();
	}
}
已采纳 ? 0 0 0 编辑

撰写答案