设计模式之工厂模式(FactoryMethordPattern)

本文介绍了工厂模式的基本概念,并通过示例代码展示了如何使用工厂方法模式来创建不同类型的对象。通过God类调用ForestFactory类,实现了根据传入的类类型动态创建Animal接口的不同实现类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工厂模式分工厂方法模式和抽象工厂模式,下次再介绍抽象工厂模式。

工厂是什么地方,是用来生成产品的地方,放在编程语言中,就是产生对象的地方。下面是Demo,包含以下几种“元素”

1.产品模子,就是一个接口,只定义方法,不实现方法。Demo中用到的是Animal接口。

2.产品,就是接口的实现类。Demo中用到的是Tiger,Bird,Fish类。

3.工厂,就是产生产品对象的类。Demo中用到的是ForestFactory类。

4.生产者,就是通过工厂生产产品的类。Demo中用到的是God类。

(1)Animal接口:

   package com.example.factory;

          public interface Animal {
                   public void move();
                   public void voice();
     }

(2)Tiger,Fish,Bird类:

(2.1)Tiger类

    package com.example.factory;

    public class Tiger implements Animal {

    @Override
         public void move() {
                 // TODO Auto-generated method stub
                System.out.println("老虎在地上跑");
       }

     @Override
         public void voice() {
                 // TODO Auto-generated method stub
                 System.out.println("老虎发出叫声");
      }

   }
(2.2)Fish类

package com.example.factory;

      public class Fish implements Animal {

         @Override
          public void move() {
              // TODO Auto-generated method stub
             System.out.println("鱼儿在水里游");
     }
         @Override
         public void voice() {
              // TODO Auto-generated method stub
           System.out.println("鱼儿发出叫声");
      }
  }

(2.3)Bird类

package com.example.factory;

   public class Bird implements Animal {

        @Override
        public void move() {
           // TODO Auto-generated method stub
            System.out.println("小鸟在天空飞");
      }

       @Override
       public void voice() {
        // TODO Auto-generated method stub
        System.out.println("小鸟发出叫声");
      }
 }
(3)ForestFactory类

        这里用到了一点反射的知识,什么是反射?百度百科:Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。意思就是说我能根据这个类的名字获得这个类的一个实例,通常我们用一个类对象都是new一个,现在不用了,你只要知道这个类的名字,就可以得到了。

关键代码:animal = (Animal) Class.forName(c.getName()).newInstance();//c为Class类型的一个对象

class.getName() : 以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。

class.forName(String s):返回与带有给定字符串名的类或接口相关联的 Class 对象

class.newtInstance( ):创建此 Class 对象所表示的类的一个新实例。

public class ForestFactory {
 
    public static Animal createAnimal(Class<?> c){
        Animal animal = null;
        try {
            animal = (Animal) Class.forName(c.getName()).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 animal;
    }
}

(4)生产者——God类

public class God {
    public static void main(String[] args){
        System.out.println("-----神创造了老虎-----");
        Tiger tiger = (Tiger) ForestFactory.createAnimal(Tiger.class);
        tiger.move();
        tiger.voice();
        
        System.out.println("-----神创造了小鸟-----");
        Bird bird = (Bird) ForestFactory.createAnimal(Bird.class);
        bird.move();
        bird.voice();
        
        System.out.println("-----神创造了鱼儿-----");
        Fish fish = (Fish) ForestFactory.createAnimal(Fish.class);
        fish.move();
        fish.voice();
    }
}

(5)打印结果:

      -----神创造了老虎-----
     老虎在地上跑
     老虎发出叫声
      -----神创造了小鸟-----
     小鸟在天空飞
     小鸟发出叫声
     -----神创造了鱼儿-----
    鱼儿在水里游
    鱼儿发出叫声






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值