码迷,mamicode.com
首页 > 其他好文 > 详细

简单工厂模式

时间:2018-04-04 18:14:57      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:调用   小孩   throw   使用   obb   static   pos   turn   java   

定义

  对象的获取并不是直接 new class(),而是通过工厂来生产对象,我们使用的时候再去工厂里拿对象。

我们为什么要这么做?

示例一:

  1 package com.gongchang;
  2 
  3 interface Person
  4 {
  5     public void study();
  6     public void hobby();
  7     public void eat();
  8     public void wear();
  9     public void sleep();
 10     
 11 }
 12 
 13 class Kid implements Person    // 或者是继承也可以
 14 {
 15 
 16     @Override
 17     public void study()
 18     {
 19         System.out.println("小孩学加减乘除");
 20         
 21     }
 22 
 23     @Override
 24     public void hobby()
 25     {
 26         System.out.println("小孩喜欢看动画片");
 27         
 28     }
 29 
 30     @Override
 31     public void eat()
 32     {
 33         System.out.println("小孩喜欢吃糖");
 34         
 35     }
 36 
 37     @Override
 38     public void wear()
 39     {
 40         System.out.println("小孩喜欢穿带卡通的衣服");
 41         
 42     }
 43 
 44     @Override
 45     public void sleep()
 46     {
 47         System.out.println("小孩每天睡眠时间很长");
 48         
 49     }
 50     
 51 }
 52 
 53 class Adult implements Person
 54 {
 55 
 56     @Override
 57     public void study()
 58     {
 59         System.out.println("成年人学专业技能");
 60         
 61     }
 62 
 63     @Override
 64     public void hobby()
 65     {
 66         System.out.println("成年人喜欢竞技运动");
 67         
 68     }
 69 
 70     @Override
 71     public void eat()
 72     {
 73         System.out.println("成年人经常不吃早饭");
 74         
 75     }
 76 
 77     @Override
 78     public void wear()
 79     {
 80         System.out.println("成年人喜欢穿名牌");
 81         
 82     }
 83 
 84     @Override
 85     public void sleep()
 86     {
 87         System.out.println("成年人每天睡眠时间短");
 88         
 89     }
 90 }
 91 
 92 public class Test
 93 {
 94     public static void main(String[] args)
 95     {
 96         Kid kid = new Kid();
 97         kid.study();
 98         kid.hobby();
 99         kid.eat();
100         kid.wear();
101         kid.sleep();
102     }
103 }

如果在 Test 类里面我现在的需求不需要 new Kid() 了,我现在需要 new Adult(),但是我还是要实现这些功能(只不过不同对象的这些功能内容不一样而已)。那我们就得这样改:

示例二:

 1 class Test
 2 {
 3     public static void main(String[] args)
 4     {
 5         Adult adult = new Adult(); // 对象重新创建,并且所有的方法的调用者也要变成 adult 对象
 6         adult.study();
 7         adult.hobby();
 8         adult.eat();
 9         adult.wear();
10         adult.sleep();
11     }
12 }

仔细一想,造成这个的原因就是我们的调用方和对象的创建操作耦合在一起了。换句话说,如果有一个第三方来创建对象,当我们需要什么对象的时候直接从里面取就可以了,这样不是很好吗?

示例三:

 1 /**
 2  * 工厂类:
 3  */
 4 class Factory
 5 {
 6     public Person getObject(String className) throws Exception 
 7     {
 8         return (Person) Class.forName(className).newInstance();
 9     }
10

 此时调用方就可以这样写:

 1 public class Test{
 2     public static void main(String[] args) throws Exception
 3     {
 4         Person person = Factory.getObject("com.gongchang.Kid"); // 扩展的时候可以根据配置文件灵活获取(即使现在换成 Adult,只需要改一下配置文件)
 5         person.study();
 6         person.hobby();
 7         person.eat();
 8         person.wear();
 9         person.sleep();
10     }
11 }

注意:简单工厂模式或者说工厂模式的关注点并不在于在工厂中是如何生产对象的,而在于将创建产品与消费产品分离(即:解耦合)。

简单工厂模式在Java中的应用

  未完待续。。。。。

工厂模式的缺点

  使用反射效率会低一些

简单工厂模式

标签:调用   小孩   throw   使用   obb   static   pos   turn   java   

原文地址:https://www.cnblogs.com/tkzL/p/8710924.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!