(@WhiteTaken)设计模式学习——简单工厂模式

最近工作比较忙,所以没有怎么写博客,这几天将集中学习一下(厉风行)讲解的设计模式的相关知识,并对主要的代码进行介绍。

言归正传,接下来介绍最简单也是最基础的简单工厂设计模式。

什么是简单工厂?

简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,创建的实例通常都具有共同的父类。

假如我们有几种水果,苹果,香蕉,我们希望获得这些水果。

首先我们声明一个水果接口。

1 public interface Fruit {
2     public void Get();
3 }
View Code

然后我们需要让苹果,香蕉的去实现这个接口。

1 public class Apple implements Fruit{
2     public void Get()
3     {
4         System.out.println("Apple");
5     }
6 }
View Code

在主类中我们可以通过,直接new一个对象,来创建苹果香蕉,然后调用其Get方法。但是这样做并不是我们想要完成的效果,为了尽可能的降低耦合。

可以通过创建一个水果的简单工厂,完成水果对象的获取。

以下的几种方式均可。

 1 import java.lang.invoke.CallSite;
 2 
 3 public class FruitFactory {
 4 //    public static Fruit GetApple(){
 5 //        return new Apple();
 6 //    }
 7 //    
 8 //    public static Fruit GetBanana(){
 9 //        return new Banana();
10 //    }
11     
12 //    public static Fruit GetFruit(String type)
13 //    {
14 //        if(type.equals("Apple"))
15 //        {
16 //            return new Apple();
17 //        }else if(type.equals("Banana"))
18 //        {
19 //            return new Banana();
20 //        }
21 //        return null;        
22 //    }
23     
24 //    public static Fruit GetFruit(String type) throws InstantiationException, IllegalAccessException
25 //    {
26 //        if(type.equalsIgnoreCase("apple"))
27 //        {
28 //            return (Fruit)Apple.class.newInstance();
29 //        }else if(type.equalsIgnoreCase("banana"))
30 //        {
31 //            return (Fruit)Banana.class.newInstance();
32 //        }else{
33 //            System.out.println("找不到对应的水果");
34 //            return null;
35 //        }    
36 //    }
37     
38     public static Fruit GetFruit(String type) throws InstantiationException, IllegalAccessException
39     {
40         try {
41             Class fruit=Class.forName(type);
42             return (Fruit)fruit.newInstance();
43         } catch (ClassNotFoundException e) {
44             // TODO Auto-generated catch block
45             e.printStackTrace();
46         }
47         return null;
48     }
49 }
View Code

这样主方法,也就是我们的客户端,就可以通过直接给出要获得的对象的名称,直接获得想要的对象。

 1 public class MainClass {
 2     public static void main(String[] args) throws InstantiationException, IllegalAccessException {
 3 //        Fruit apple=FruitFactory.GetApple();
 4 //        Fruit banana=FruitFactory.GetBanana();
 5 //        apple.Get();
 6 //        banana.Get();
 7         
 8         Fruit apple=FruitFactory.GetFruit("Apple");
 9         Fruit banana=FruitFactory.GetFruit("Banana");
10         apple.Get();
11         banana.Get();
12     }
13 }
View Code

水果工厂就是一个简单工厂,如果我们这时候要创建葡萄类,只需让其实现Fruit接口即可,这是在客户端就可以通过葡萄对象的名称,获得葡萄对象,而在葡萄类中的相关功能,在主客户端中都不用考虑。

简单工厂的优点:

在这个模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。

缺点:

简单工厂模式的缺点也正体现在其工厂类上,由于工厂类集中了所有实例的创建逻辑,所以“高内聚”方面做的并不好。另外,当系统中的具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,拓展性不是很好。

 

posted @ 2017-02-07 20:59  WhiteTaken  阅读(253)  评论(0编辑  收藏  举报