三种工厂模式
- 工厂模式的意义,就是将实例化的代码解放出来放在一个类里面统一管理,达到和项目依赖关系的解耦。扩展性和维护性变强。
- 遵循了设计模式的依赖抽象原则。
简单工厂模式
其实简单工厂模式是最体现出上方讲的工厂模式的涉及理念及优点。工厂模式并不难,只要你明白他的优点和使用场景运用即可。简单讲一个需求。猫阿狗阿写一个方法让他们跑起来。正常想法就是new三个对象出来写一个run方法不就行了吗。下面是简单工厂模式的实现代码。
public class SimpleFactory {
public static Animal getAnimal(String type) {
if (type.equals("cat")) {
return new Cat();
}else if (type.equals("dog")) {
return new Dog();
} else {
return new Chicken();
}
}
}
public abstract class Animal {
abstract void run();
}
猫的狗的代码相同我就少贴一段了。源码在最后会提供。
public class Cat extends Animal {
@Override
void run() {
System.out.println("猫跑");
}
}
这里讲一下简单工厂模式优缺点:是由一个工厂对象决定创建处哪一种产品类的实例,定义一个创建对象的类,由这个类来封装实例化对象行为的代码。代码简单易读,再来个动物园也没事。但是缺点可扩展性差,类型太多的话代码并不美观,而且因为所有的对象创建都是由这个简单工厂创建,所以一旦出问题,其他都会受牵连。
普通工厂模式
工厂模式和简单工厂模式大同小异,只不过业务上产品/动物下还有可能还会再分类,思路和简单工厂相同,只不过将每个产品/动物再分一层作为工厂类。与简单工厂不同的是由工厂的子类去实现具体的实现方式,下面贴代码:
public abstract class FactoryMethod {
public abstract Animal getAnimal(String type);
}
public class RedFactory extends FactoryMethod {
@Override
public Animal getAnimal(String type) {
if (type.equals("chicken")) {
return new RedChicken();
} else if (type.equals("dog")) {
return new RedDog();
} else if (type.equals("cat")) {
return new RedCat();
} else {
return null;
}
}
}
public class BuleFactory extends FactoryMethod {
@Override
public Animal getAnimal(String type) {
if (type.equals("chicken")) {
return new BlueChinken();
} else if (type.equals("dog")) {
return new BlueDog();
} else if (type.equals("cat")) {
return new BuleCat();
} else {
return null;
}
}
}
public abstract class Animal {
abstract void run();
}
public class RedCat extends Animal {
@Override
void run() {
System.out.println("Red猫跑");
}
}
public class BuleCat extends Animal {
@Override
void run() {
System.out.println("Bule猫跑");
}
}
抽象工厂模式
抽象工厂模式与普通工厂模式理念一样,其实不要把工厂模式想的太复杂,就是产品分类,在分类的创建思路。通过子类层层实现具体的产品即可。只不过实现方法不同,通过继承接口来实现。
public abstract class FactoryMethod {
public abstract Animal getAnimal(String type);
}
public class RedFactory implements AbstractFactory {
@Override
public Animal getAnimal(String type) {
if (type.equals("chicken")) {
return new RedChicken();
} else if (type.equals("dog")) {
return new RedDog();
} else if (type.equals("cat")) {
return new RedCat();
} else {
return null;
}
}
}
public class BuleFactory implements AbstractFactory {
@Override
public Animal getAnimal(String type) {
if (type.equals("chicken")) {
return new BlueChinken();
} else if (type.equals("dog")) {
return new BlueDog();
} else if (type.equals("cat")) {
return new BuleCat();
} else {
return null;
}
}
}
public class RedCat extends Animal {
@Override
void run() {
System.out.println("Red猫跑");
}
}
public class BuleCat extends Animal {
@Override
void run() {
System.out.println("Bule猫跑");
}
}
GitHub里面代码更加详细,有兴趣可查看:github.com/Liyinzuo/De…
简单的简述了一下工厂模式,如果有错误的地方欢迎指正。