1、简单工厂
package com.study.factory;
interface IAnimal {
public abstract void showKind();
}
class Dog implements IAnimal {
public void showKind() {
System.out.println("Dog");
}
}
class Tiger implements IAnimal {
public void showKind() {
System.out.println("Tiger");
}
}
class AnimalFactory {
public IAnimal createAnimal(int choose) {
IAnimal animal = null;
if (choose==1) {
animal = new Dog();
}else{
animal = new Tiger();
}
return animal;
}
}
public class Animal {
public static void main(String[] args) {
IAnimal animal = new AnimalFactory().createAnimal(0);
animal.showKind();
}
}
复用性:该程序中将Dog和Tiger继承IAnimal接口,该接口中抽象出了Animal的共性方法,提高复用性。
维护性:各个工厂方法互不影响,如需增加其他工厂方法,可直接继承IAnimal,在AnimalFactory中增加一组判断即可。
2.工厂方法
package com.study.factory;
interface IAnimal {
public abstract void showKind();
}
class Dog implements IAnimal {
public void showKind() {
System.out.println("Dog");
}
}
class Tiger implements IAnimal {
public void showKind() {
System.out.println("Tiger");
}
}
interface IAnimalFactory {
IAnimal createAnimal();
}
class DogFactrory implements IAnimalFactory {
public IAnimal createAnimal() {
return new Dog();
}
}
class TigerFactory implements IAnimalFactory {
public IAnimal createAnimal() {
return new Tiger();
}
}
public class Animal {
public static void main(String[] args) {
IAnimalFactory animalFactory = new DogFactrory();
animalFactory.createAnimal().showKind();
}
}
复用性:该工厂接口中有一个创建对象的操作,由子类进行实现,若后续有相同类型的对象,可以直接实现该接口,实现create方法,返回对象。
维护性:各个工厂方法独立,方便修改。同时增加新功能时只需新建一个工厂实现Factory,即可返回对象。在具体要生产哪个工厂时,将判断移到了客户端,降低了耦合性。
比较简单工厂和工厂方法模式的特点:
简单工厂模式:专门定义一个工厂类负责创建其他类的实例。工厂类中包含了必要的逻辑,根据客户端需要的条件动态实例化相关类,部分满足开闭原则。增加新功能是工厂类内部需要修改。
工厂方法模式:创建对象的接口,让子类去决定具体实例化的对象,把简单的内部逻辑移到了客户端,工厂方法完全满足开闭原则,可维护性更强,又保持了封装对象创建过程的优点。