Java——设计模式(简单工厂模式)

 * A:简单工厂模式概述
 *  简单工厂模式又叫静态工厂方法模式,它定义了一个具体的工厂类负责创建一些类的实例
 * B:优点
 *  客户端不需要再负责对象的创建,从而明确了各个类的职责
 *  简单来说,客户端你只需要用就可以了,就不用创建了,工厂来创建就可以了
 * C:缺点
 *  这个静态工厂类负责所有对象的创建,如果有新的对象增加,或者某些对象的创建方式不同,就需要不断地修改工厂类,不利于后期的维护
 *  也就是说:你得需要不断地去修改你的源码,是不利于后期的维护的
 * D:案例演示
 *  动物抽象类:public abstract Animal(public abstract void eat();)
 *  具体狗类:public class Dog extends Animal{}
 *  具体猫类:public class Cat extends Animal{}
 *  开始:在测试类中每个具体的内容自己创建对象,但是,创建对象的工作如果比较麻烦,就需要有人专门做这个事情,所以就制造了一个专门的类来创建对象
 * 
 * 例如:本来我们创建对象需要自己去创建,比如说,你需要一只狗,自己就创建一个,而简单工厂认为,对于这件事就不劳费客户了,创建狗对象或者是猫对象,交个简单工厂去创建就可以了
 * 要狗,简单工厂就会给客户提供狗,要猫,简单工厂就会给顾客提供猫;所以,现在我们就要做一个工厂,这个工厂就是用来生产狗,或者猫的;
 * 首先,要创建工厂得有Animal、Dog、Cat这些类
package com.yy.简单工厂;

public abstract class Animal {      //创建一个动物抽象类,在这个Animal抽象类里面有个  吃  的方法
    public abstract void eat();

 }
package com.yy.简单工厂;

public class Dog extends Animal {       //创建一个狗类,让Dog类去继承Animal这个抽象类

    public void eat(){                  //并且去重写Animal里面的的eat这个抽象方法
        System.out.println("狗吃肉");    //然后输出一句话:狗吃肉
    }

}
package com.yy.简单工厂;

public class Cat extends Animal {           //创建一个猫类,让Cat类去继承Animal这个抽象类

    public void eat() {                     //并且去重写Animal里面的的eat这个抽象方法
        System.out.println("猫吃鱼");        //然后输出一句话:狗吃肉
    }

}
package com.yy.简单工厂;

public class AnimalFactory {                    //创建一个动物工厂,目的是为了生产动物,可以生产狗,也可以生产猫,需要啥就创建啥对象即可

    /*
    public static Dog createDog(){              //该方法用来创建狗
        return new Dog();                       //返回一个狗
    }

    public static Cat createCat(){              //该方法用来创建猫
        return new Cat();                       //返回一个猫
    }
    */
    //我们发现,如果动物太多的话,必须得定义很多个方法,复用性太差





    //改进
    public static Animal createAnimal(String name){         //返回类型为Animal,参数为一个 名字
        if("dog".equals(name)){                             //如果传入的是一只狗的话,就对参数进行判断
            return new Dog();                               //参数是狗,就返回一个狗
        }else if("cat".equals(name)){                       //如果传入的是一只猫的话,就对参数进行判断
            return new Cat();                               //参数是猫,就返回一个狗
        }else {                                             //如果传入的是既不是狗又不是猫的话
            return null;                                    //就返回一个null
        }
    //如果在有一个其他的类,就会返回null,一返回null,Test这个类就会进行,null就开始调用eat这个方法,然后就会出现空指针异常,这个就是简单工厂模式的弊端所在
    }

}
package com.yy.简单工厂;

public class Test {     //做一个测试类
    public static void main(String[] args) {
        /*Dog yy = AnimalFactory.createDog();                   //想要一只狗,运用  类名.  来调用
        System.out.println(yy);*/                               //打印 狗 ,这里没有重写toString方法,所以返回为类名+@+HashCode16进制

        Dog d = (Dog) AnimalFactory.createAnimal("dog");        //通过   类名.  来调用,由于 AnimalFactory.createAnimal该方法返回的是Animal,而我们通过Dog接收,所以这时要进行强转,由Animal类型强制转换为Dog类型
        d.eat();                                                //类名.方法    调用Dog类里面的eat方法
        //输出结果:狗吃肉

        Cat c =  (Cat) AnimalFactory.createAnimal("cat");
        c.eat();
        //输出结果:猫吃鱼
    }

}

猜你喜欢

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