最近工作比较忙,所以没有怎么写博客,这几天将集中学习一下(厉风行)讲解的设计模式的相关知识,并对主要的代码进行介绍。
言归正传,接下来介绍最简单也是最基础的简单工厂设计模式。
什么是简单工厂?
简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,创建的实例通常都具有共同的父类。
假如我们有几种水果,苹果,香蕉,我们希望获得这些水果。
首先我们声明一个水果接口。
1 public interface Fruit { 2 public void Get(); 3 }
然后我们需要让苹果,香蕉的去实现这个接口。
1 public class Apple implements Fruit{ 2 public void Get() 3 { 4 System.out.println("Apple"); 5 } 6 }
在主类中我们可以通过,直接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 }
这样主方法,也就是我们的客户端,就可以通过直接给出要获得的对象的名称,直接获得想要的对象。
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 }
水果工厂就是一个简单工厂,如果我们这时候要创建葡萄类,只需让其实现Fruit接口即可,这是在客户端就可以通过葡萄对象的名称,获得葡萄对象,而在葡萄类中的相关功能,在主客户端中都不用考虑。
简单工厂的优点:
在这个模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。
缺点:
简单工厂模式的缺点也正体现在其工厂类上,由于工厂类集中了所有实例的创建逻辑,所以“高内聚”方面做的并不好。另外,当系统中的具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,拓展性不是很好。