Java——设计模式(工厂方法模式)

* A:工厂方法模式概述
 *  工厂方法模式中抽象工厂类负责定义创建对象的接口,具体对象的创建工作由继承抽象工厂的具体类实现。
 *  简单来说:先定义一个工厂,工厂里面有些方法,这些方法就是用来创建动物的,然后有很多子工厂,顾客想创建猫,就来个猫工厂,想创建狗,就来个狗工厂
 *  创建针对的对象就是创建针对的工厂
 * B:优点
 *  客户端不需要再负责对象的创建,从而明确了各个类的职责,如果有新的对象增加,只需要增加一个具体的类和具体的工厂类即可,不影响已有的代码,后期维护容易,增强了系统的扩展性
 *  也就是,不用修改原来的代码,工厂定义完了,猫工厂,狗工厂定义完了之后,影响不大,以后想要再扩展的话,就在创建一个工厂,想要啥,就创建啥工厂就可以了,不用改原来的工厂,也不用该原来的设备
 * C:缺点
 *  需要额外的编写代码,增加了工作量
 * D:案例演示:
 *  动物抽象类:public abstract Animal(public abstract void eat();)
 *  工厂接口:public interface Factory(public abstract Animal creatAnimal();)
 *  具体狗类:public class Dog extends Animal{}
 *  具体猫类:public class Cat extends Animal{}
 *  开始:在测试类中每一个具体的内容自己创建对象,但是,创建对象的工作如果比较麻烦,就需要有人专门做这个事情,所以就制造了一个专门的类来创建对象,发现每次修改代码太麻烦,用工厂方法改进
 *  针对每一个具体的实现提供一个具体的工厂
 *  狗工厂:public class DogFactory implements Factory{
 *          public Animal createAnimal(){~~~}
 *      }
 *  猫工厂:public class CatFactory implements Factory{
 *          public Animal creatAnimal(){~~~}
 *      }
package com.yy.工厂方法;

public interface Factory {          //先定义一个   工厂   接口
    public Animal createAnimal();   //该接口里面有个createAnimal方法,目的是为了创建动物
                                    //返回值类只能是Animal类型,不能是返回后狗,猫之类的;也就是所谓的多态的思想
}
package com.yy.工厂方法;

public class DogFactory implements Factory {        //创建一个  狗  工厂(DogFactory类),让DogFactory去实现Factory这个接口

    @Override
    public Animal createAnimal() {                  //然后再重写Factory这个接口里面的createAnimal方法

        return new Dog();                           //返回一只狗
    }   

}
package com.yy.工厂方法;

public class CatFactory implements Factory {        //创建一个  猫  工厂(CatFactory类),让CatFactory去实现Factory这个接口

    public Animal createAnimal() {                  //然后再重写Factory这个接口里面的createAnimal方法

        return new Cat();                           //返回一只猫
    }

}
package com.yy.工厂方法;

public class Test {                                 //创建一个测试类
    public static void main(String[] args) {
        DogFactory df = new DogFactory();           //创建 狗 工厂对象
        Dog d = (Dog) df.createAnimal();            //强制类型转换df.createAnimal();因为,createAnimal这个方法的返回值类型是Animal,想要用 Dog类型接收,就得将Animal类型强转为Dog类型
        d.eat();
    }

}

猜你喜欢

转载自blog.csdn.net/qq_41264055/article/details/81297547