简单工厂模式

来源:互联网 发布:如何安装车载导航软件 编辑:程序博客网 时间:2024/06/05 03:16

简单工厂模式

工厂模式定义了一个创建产品的工厂接口,让子类决定实例化哪一种实例对象,也就是将创建具体实例的工作推迟到了子类当中,核心工厂不再负责具体产品的创建。(具体生产类实现工厂接口,实现接口方法,生产具体实例)

设计原则:

1.开闭原则---对扩展开放,对修改关闭

2.依赖倒置原则----不论是接口还是具体的实例,都应该依赖于抽象的类,(具体model都会继承一个抽象的类),而不是具体实现类(具体实现类,又可能会修改,破坏了对修改关闭的原则)

试用场景

1.当子类型有可能会有很多,以后需要不断添加不同的子类实现时。

2.当一个系统尚在框架设计阶段,还不知道将来需要实例化哪些具体类时(相当于设计一张设计图,知识定义了某些规则而已)

java List 使用了工厂模式    


1.public interface List<E> extends Collection<E>    List本身定义就是接口,内部包含Iterator接口,

2.ArrayList 继承了抽象类 abStractList,   AbstractList 实现了List 接口,(此处就是典型的工厂模式,arrayList 的model 继承至抽象类,并且实现了对应的接口)

3.源码中 Iterator是在AbstractList 实现的,(list的方法在abstractlist实现,在arraylist中被重写)

4.此处的abstractList就是抽象组件(依赖倒置原则),此处的依赖倒置理解为:a为接口,如果此时有两个子类(c,d),如果中间不设置一个中间件,当a接口发生变化(增加了一个方法newFunc()),此时c,d中都需要修改(增加对a中的newFunc()进行实现),但是如果新建立一个Abstract类 b,b实现了接口,c和d继承b,这时候c和d只要有选择的重写b中的方法就可以,而且a发生变化时,只需要修改b,c和d就可以不需要做任何修改。。此处的AbstractList就是充当b的角色。

demo:

通过反射机制实现的工厂模式

interface Car{
    public void run();
    public void stop();
}


class Benz implements Car{
    public void run(){
        System.out.println("Benz开始启动了。。。。。");
    }

    public void stop(){
        System.out.println("Benz停车了。。。。。");
    }

}


class Ford implements Car{
    public void run(){
        System.out.println("Ford开始启动了。。。");
    }

    public void stop(){
        System.out.println("Ford停车了。。。。");
    }

}


class Toyota implements Car{
    public void run(){
        System.out.println("Toyota开始启动了。。。");
    }

    public void stop(){
        System.out.println("Toyota停车了。。。。");
    }

}


class Factory{
    public static Car getCarInstance(String type){
        Car c=null;
        try {
            c=(Car)Class.forName("org.jzkangta.factorydemo03."+type).newInstance();//利用反射得到汽车类型 
        }
 catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    
        return c;
    }

}

public class FactoryDemo03 {

    public static void main(String[] args) {
        Car c=Factory.getCarInstance("Toyota");
        if(c!=null){
            c.run();
            c.stop();
        }
else{
            System.out.println("造不了这种汽车。。。");
        }

        

    }


}


0 0
原创粉丝点击