个人感觉工厂模式是给我们的程序更加的遵守OCP原则(对扩展开放,对修改关闭)提供了一种思路,从而使得我们给类增加新功能的时候,尽量不修改代码,或者尽可能少修改代码。
1.传统方法
abstract class Base{}
class A1 extends Base{}
class A2 extends Base{}
class C{
Base base;
public C(String name){
if(name.equals("A1")){
base = new A1();
}else if(name.equals("A2")){
base = new A2();
}
}
}
这种写法特扩展性很差,如果有多个类调用了Base()对象,如果此时要增减,就会进行大量的代码修改。
2.简单工厂方法:
我们可以把创建Base对象封装到一个类中,这样当我们增减Base种类时,只需要修改该类就可,其它有创建 到Base对象的代码就不需要修改了,即我们定义了一个专门用于进行类实例化的“工厂”。
abstract class Base{}
class A1 extends Base{}
class A2 extends Base{}
class SimpleFactory{
public SimpleFactory(String name){
if(name.equals("A1")){
base = new A1();
}else if(name.equals("A2")){
base = new A2();
}
}
}
class C{
new SimpleFactory();
}
class D{
new SimpleFactory();
}
3.工厂方法模式
定义了一个创建对象的抽象方法,由子类决定要实例化的类,工厂方法模式将 对象的实例化推迟到子类。
比如现在A1和A2两个类会分为红色和绿色,即RedA1,RedA2,GreenA1,GreenA2。
abstract class Base{}
class RedA1 extends Base{}
class RedA2 extends Base{}
class GreenA1 extends Base{}
class GreenA2 extends Base{}
abstract class Factory{
public abstract void createBase(String name);
public Factory(String name){
createBase(name);
}
}
class RedFactory extends Factory(){
public void createBase(String name){
if(name.equals("A1")){
base = new RedA1();
}else if(name.equals("A2")){
base = new RedA2();
}
}
}
class GreenFactory extends Factory(){
public void createBase(String name){
if(name.equals("A1")){
base = new GreenA1();
}else if(name.equals("A2")){
base = new GreenA2();
}
}
}
class C{
new RedFactory(name);
}
class D{
new GreenFactory(name);
}
4.抽象工厂方法
抽象工厂模式就是对工厂方法模式的改进(或者称为进一步的抽象),可以将简单工厂模式和工厂方法模式进行整合。
abstract class Base{}
class RedA1 extends Base{}
class RedA2 extends Base{}
class GreenA1 extends Base{}
class GreenA2 extends Base{}
public interface AbstractFactory{
public void createBase(String name);
}
class RedFactory implements AbstractFactory(){
public void createBase(String name){
if(name.equals("A1")){
base = new RedA1();
}else if(name.equals("A2")){
base = new RedA2();
}
}
}
class GreenFactory implements AbstractFactory(){
public void createBase(String name){
if(name.equals("A1")){
base = new GreenA1();
}else if(name.equals("A2")){
base = new GreenA2();
}
}
}
class Order{
private AbstractFactory factory;
public Order(AbstractFactory factory){
this.factory = factory;
String name = getName();
factory.createBase(name);
}
public String getName(){
这里面就是获取用户在控制台输入的内容
}
}
class C{
new Order(new RedFactory);
}
class D{
new Order(new GreenFactory);
}
总结
工厂模式的意义:
将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。