在面向对象编程中,由于有继承blackDog可以当成Dog处理,如果要扩展新的Dog,只需要添加新的类就好了,因此关键时如何创建一个对象。通常我们使用(Dog dog = new BlackDod();)创建一个对象,当我们需要创建一个新的对象时,就需要更改代码,这样就违背了开闭原则,其次主类除了其固有的功能外,还需要负责创建新的对象,这也违背了单一原则,因此可以增加新的类用于创建对象,称之为工厂模式。
public class Factory {
public enum DogType{
BlackDog,WhiteDog,BlueDog;
}
public static Dog create(DogType type){
if(type.equals(DogType.WhiteDog))
return new WhiteDog;
if(type.equals(DogType.BlackDog))
return new BlackDog;
if(type.equals(DogType.BlueDog))
return new BlueDog;
else return null;
}
}
public class Factory {
private Map<String,Class> registeredDog = new HashMap<String, Class>();
public void registerDog(String dogId, Class dogClass){
registeredDog.put(dogId,dogClass);
}
public Dog create(String type) throws IllegalAccessException, InstantiationException {
Class dogClass = registeredDog.get(type);
return (Dog)dogClass.newInstance();
}
}
使用newInstance方法进行类注册的简单工厂模式
在Dog基类中添加一个抽象方法
abstract public Dog newInstance();
对每一个具体的Dog,都要实现基类声明的抽象方法。
@Override
public BlackDog newInstance(){
return new BlackDog();
}
public class Factory {
private Map<String,Dog> registeredDog = new HashMap<String, Dog>();
public void registerDog(String dogId, Dog dog){
registeredDog.put(dogId,dog);
}
public AbstractDog create(String type){
return registeredDog.get(type).newInstance();
}
}
为 Cat和 Dog 对象创建抽象类来获取工厂
public abstract class AbstractFactory {
public abstract Dog getDog(String breed);
public abstract Cat getCat(String breed) ;
}
创建扩展了 AbstractFactory 的工厂类,基于给定的信息生成实体类的对象。
public class DogFactory extends AbstractFactory {
@Override
public Dog getDog(String breed){
if(breed == null)
return null;
if(breed.equalsIgnoreCase("husky"))
return new HuskyDog();
else if(breed.equalsIgnoreCase("poodle"))
return new PoodleDog();
return null;
}
@Override
public Cat getCat(String breed) {
return null;
}
}
public class CatFactory extends AbstractFactory {
@Override
public Dog getDog(String breed){
return null;
}
@Override
public Cat getCat(String breed) {
if(breed == null)
return null;
if(breed.equalsIgnoreCase("ragdoll"))
return new RagdollCat();
else if(breed.equalsIgnoreCase("manx"))
return new ManxCat();
return null;
}
}
创建一个工厂生成器类,通过传递cat或dog信息来获取工厂。
public class FactoryProducer {
public static AbstractFactory getFactory(String choice){
if(choice.equalsIgnoreCase("cat")){
return new CatFactory();
} else if(choice.equalsIgnoreCase("dog")){
return new DogFactory();
}
return null;
}
}