一、工厂模式的定义
工厂模式就是调用一个方法来获取类的实例对象,就不用明面上new了,因为那样耦合度太高。如果改动一个地方,那么就是一个不小的工作量(如:类换名字了)。
二、工厂模式的好处
降低耦合度、使用户调用方便
三、简单工厂模式
1.简单工厂模式的类图
2.简单工厂模式的要素
①产品接口 Intercept
②产品实现类 Class
③调用产品实现类的工厂 Factory
3.简单工厂模式的简单实现
public interface Animal { void run(); } |
public class Dog implements Animal{ @Override public void run() { System.out.println("我是可爱的二哈,四个腿走!"); } } |
public class People implements Animal{ @Override public void run() { System.out.println("我是一个大帅哥,两条腿走!"); } } |
/**
* 工厂模式 -- 静态工厂
* @author 王坤
* @time 2018-10-10 10:19
* @function 工厂模式
*/
public class Factory1 {
/* 狗 */
public static final int DOG = 1;
/* 人 */
public static final int PEOPLE = 2;
public static Animal getAnimal(int name){
if(name == 1){
return new Dog();
}else if (name == 2){
return new People();
}
return null;
}
/* 测试 */
public static void main(String[] args) {
Animal animal = Factory1.getAnimal(Factory1.DOG);
animal.run();
System.out.println("************************************");
animal = Factory1.getAnimal(Factory1.PEOPLE);
animal.run();
}
} |
结果:
注意:上面的工厂模式的调用方法已经被标出来了,这个属于静态工厂模式;这个方法还有一个缺陷,可以想一想,如果现在我要加一个类Cat.class,那么该怎么办呢?还要继续改工厂方法吗?如果更多呢,是不是觉得很是繁琐。所以,有了下面的方法,使用类的反射来实现工厂方法。
/** * 工厂模式 -- 静态工厂 * @author 王坤 * @time 2018-10-10 12:58 * @function 工厂模式 */ public class Factory2 { public static Animal getAnimal(String className){ try { Animal animal = (Animal) Class.forName(className).newInstance(); return animal; } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; } /* 测试 */ public static void main(String[] args) { Animal animal = Factory2.getAnimal("com.Factory.www.Dog"); animal.run(); System.out.println("************************************"); animal = Factory2.getAnimal("com.Factory.www.People"); animal.run(); } } |
运行结果:
注意:可以看出运行结果是一样的,并且这样的方法耦合度一下子就下来了。但是,还有一个缺点,可以看出用户调用的时候没有之前那么容易了,用户的操作变得困难了。那么,怎么办呢?难道,还要使用if条件,进行类全定名来吗?这样不是又回到上一个问题了吗?其实,我们可以使用Properties文件,进行key-value的存储。这样问题就迎刃而解了。
四、抽象工厂模式
1.抽象工厂模式 -- 类图
2.抽象工厂需要的元素
①多个产品接口、产品实现类
②工厂接口、专业工厂实现类(调用不同的产品实现类)
3.实现过程
public interface Boy { public void desc(); } |
public interface Gril { public void desc(); } |
public class shengdanBoy implements Boy{ @Override public void desc() { System.out.println("我是圣诞男孩!"); } } public class shengdanGril implements Gril{ @Override public void desc() { System.out.println("我是一个圣诞女孩!"); } } |
public class xinnianBoy implements Boy{ @Override public void desc() { System.out.println("我是一个新年男孩!"); } } public class xinnianGril implements Gril{ @Override public void desc() { System.out.println("我是一个新年女孩!"); } } |
public interface AbFactory { Boy getBoy(); Gril getGril(); } |
public class xinnianFactory implements AbFactory{ @Override public Boy getBoy() { return new xinnianBoy(); } @Override public Gril getGril() { return new xinnianGril(); } } |
public class shengdanFactory implements AbFactory{ @Override public Boy getBoy() { return new shengdanBoy(); } @Override public Gril getGril() { return new shengdanGril(); } } |
public class TestFactory { public static void main(String[] args) { xinnianFactory factory = new xinnianFactory(); Boy boy = factory.getBoy(); boy.desc(); } } |
运行结果: