简单工厂模式

  1、概述
     简单工厂模式 又叫静态工厂方法模式,它定义一个具体的工厂类来负责创建一些类的实例。

  如:Dog类对象,不再在程序中使用new Dog()的方式来创建了。而是先定义一个DogFactory类,在该类中有负责创建Dog的代码,且对外提供一个获取Dog实例的静态方法。我们在客户端程序中要使用到Dog对象,通过 Dog dog = DogFactory.createDog();来获取Dog的实例即可。

 

2、 优缺点

  优点:客户端不需要再负责对象的创建,从而明确了各个类的职责。
  缺点:这个静态工厂类负责所有对象的创建,如果有新的对象增加,或者某些对象的创建方式不同,就需要不断的修改工厂类,不利于后期的维护。


 3、代码演示

环境代码搭建:

  定义一个 Animal 动物抽象类

// 动物抽象类
public abstract class Animal {
    public abstract void eat();    // 吃 的 功能
}

 

  定义一个Dog类

// 狗类 
public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("笨狗吃骨头...");
    }
}

 

定义一个Rabbit 类

// 兔类
public class Rabbit extends Animal {

    @Override
    public void eat() {
        System.out.println("兔子爱吃隔壁草...");
    }

}

 

代码测试

代码1:常规的方式:

public class AnimalDemo {
    public static void main(String[] args) {
        //1、传统的方式: 先创建具体类,再调用方法。
        Dog d = new Dog();     
        Rabbit r = new Rabbit();
      
        d.eat();
        r.eat();
       }
}

笨狗吃骨头...
兔子爱吃隔壁草..

 

 


 

代码2:通过工厂造各种 动物对象

定义一个 AnimalFactory 动物工厂 类

public class AnimalFactory {
    
    // 1、构造方法私有。避免在其它类中,可以使用new的方式来创建AnimalFactory对象。
    private AnimalFactory() {
    }
    
    // 2.1、 提供一个创建Dog类对象的功能。且对外提供一个获取Dog实例的方法。因此是public修饰。
  //    注意:因为承接上面第一点,该工厂类不能在其他类中创建对象。因此,该方法必须是static的。

  // 其他程序中获取Dog实例的方式:Dog dog = AnimalFactory.createDog(); public static Dog createDog() { return new Dog(); } // 2.2 提供一个创建Rabbit类对象的功能。(同理) public static Rabbit createRabbit() { return new Rabbit(); } }

测试

public class AnimalDemo {

    public static void main(String[] args) {
         // 简单工厂
         Animal animal = AnimalFactory.createDog();
     animal.eat();  animal
= AnimalFactory.createRabbit(); animal.eat(); } }
笨狗吃骨头...
兔子爱吃隔壁草...
 

 

 


 

代码3:对工厂改进后

package com.monkey1028;

public class AnimalFactory {
    
    // 1、构造方法私有
    private AnimalFactory() {
        
    }
    // 2、根据用户传入的动物名来创建相应的动物实例。
    public static Animal createAnimal(String type) {
        
        if("dog".equals(type)) {
            return new Dog();
        }
             
        if("rabbit".equals(type)) {
            return new Rabbit();
            
        }else {
            return null;
        }
    }
}
    
 

 

 

测试类:

public class AnimalDemo {

    public static void main(String[] args) {
        
        // 通过 AnimalFactory 动物工厂 造相应的动物对象

        Animal a = AnimalFactory.createAnimal("dog");
        a.eat();
        
        a = AnimalFactory.createAnimal("rabbit");
        a.eat();
        
        // 要是传入动物工厂中不存在的动物对象呢? 
        // 会产生空指针异常,所以要做判断
        
        System.out.println();
        
         a = AnimalFactory.createAnimal("pig");
        
        if(a != null) {
        a.eat();
        }else {
            System.out.println("该工厂还暂时不具备生产该动物的资质......");
        }
    }

}

 

结果:

笨狗吃骨头...
兔子爱吃隔壁草...

该工厂还暂时不具备生产该动物的资质......

 

posted @ 2019-11-06 20:36  小茅棚  阅读(128)  评论(0编辑  收藏  举报