最近工作比较忙,所以没有怎么写博客,这几天将集中学习一下(厉风行)讲解的设计模式的相关知识,并对主要的代码进行介绍。
言归正传,接下来介绍最简单也是最基础的简单工厂设计模式。
什么是简单工厂?
简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,创建的实例通常都具有共同的父类。
假如我们有几种水果,苹果,香蕉,我们希望获得这些水果。
首先我们声明一个水果接口。
public interface Fruit {
public void Get();
}
然后我们需要让苹果,香蕉的去实现这个接口。
public class Apple implements Fruit{
public void Get()
{
System.out.println("Apple");
}
}
在主类中我们可以通过,直接new一个对象,来创建苹果香蕉,然后调用其Get方法。但是这样做并不是我们想要完成的效果,为了尽可能的降低耦合。
可以通过创建一个水果的简单工厂,完成水果对象的获取。
以下的几种方式均可。
import java.lang.invoke.CallSite; public class FruitFactory {
// public static Fruit GetApple(){
// return new Apple();
// }
//
// public static Fruit GetBanana(){
// return new Banana();
// } // public static Fruit GetFruit(String type)
// {
// if(type.equals("Apple"))
// {
// return new Apple();
// }else if(type.equals("Banana"))
// {
// return new Banana();
// }
// return null;
// } // public static Fruit GetFruit(String type) throws InstantiationException, IllegalAccessException
// {
// if(type.equalsIgnoreCase("apple"))
// {
// return (Fruit)Apple.class.newInstance();
// }else if(type.equalsIgnoreCase("banana"))
// {
// return (Fruit)Banana.class.newInstance();
// }else{
// System.out.println("找不到对应的水果");
// return null;
// }
// } public static Fruit GetFruit(String type) throws InstantiationException, IllegalAccessException
{
try {
Class fruit=Class.forName(type);
return (Fruit)fruit.newInstance();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
这样主方法,也就是我们的客户端,就可以通过直接给出要获得的对象的名称,直接获得想要的对象。
public class MainClass {
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
// Fruit apple=FruitFactory.GetApple();
// Fruit banana=FruitFactory.GetBanana();
// apple.Get();
// banana.Get(); Fruit apple=FruitFactory.GetFruit("Apple");
Fruit banana=FruitFactory.GetFruit("Banana");
apple.Get();
banana.Get();
}
}
水果工厂就是一个简单工厂,如果我们这时候要创建葡萄类,只需让其实现Fruit接口即可,这是在客户端就可以通过葡萄对象的名称,获得葡萄对象,而在葡萄类中的相关功能,在主客户端中都不用考虑。
简单工厂的优点:
在这个模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。
缺点:
简单工厂模式的缺点也正体现在其工厂类上,由于工厂类集中了所有实例的创建逻辑,所以“高内聚”方面做的并不好。另外,当系统中的具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,拓展性不是很好。