以前学习过工厂模式,但是随着时间推移又渐渐的忘得差不多了。这次看了一些相关文章,做个笔记,以谋将来。
一,为什么要使用工厂模式
工厂模式是一种常用的实例化对象模式,是用工厂方法代替new操作的一种模式。我们在写代码时经常需要根据类生成实例对象,如A a=new A( ),工厂模式也是用来创建实例对象的。
使用工厂模式可能会带来更多的代码编写工作,但是会使代码扩展性更好,并且方便以后的修改。
用new的方式创建对象,有时我们会在构造方法中做一些初始化工作,当初始化的代码很长,工作很多时,相当于将很多的鸡蛋放在一个篮子中,会有一些危险,也有悖于java面向对象的原则,面向对象的封装(Encapsulation)和分派(Delegation)告诉我们,尽量将长的代码分派“切割”成每段,将每段再“封装”起来(减少段和段之间耦合联系性),这样,就会将风险分散,以后如果需要修改,只要更改每段,不会再发生牵一动百的事情。
所以我们要把创建实例和使用实例的工作分开,也就是说,让创建实例所需要的大量初始化工作从被实例类的构造函数中分离出去。这就需要用到工厂模式了。
二,简单工厂模式
简单工厂模式应该就是在一个工厂类中的一个方法中根据不同情况生成对应的类对象。
代码:
public class SimpleFactoryPattern {
public static ISimple create(int which) {
switch (which) {
case 1:
return new SimpleA();
case 2:
return new SimpleB();
default:
return null;
}
}
}
测试类:
生成对象的时候不涉及到ISimple接口具体的实现类,达到封装效果。
public class TestClass {
@Test
public void fun1() {
ISimple simpleA = SimpleFactoryPattern.create(1);
}
}
使用简单工厂模式要注意的几个角色,首先你要定义一个接口,如上面的ISimple接口,接口下有ISimple接口的实现类,如SimpleA,其次要有一个Factory类(如上面的SimpleFactoryPattern类),用来生成产品ISimple接口的具体实例。
public class SimpleA implements ISimple {
public SimpleA() {
super();
System.out.println(".....SimpleA对象被创建了");
}
@Override
public void work() {
}
}
三,工厂方法模式(Factory Method)
工厂方法模式是对于每一种产品提供一个工厂,通过不同的工厂来创建不同的产品实例。这里需要有一个Factory抽象类或者接口,不同的工厂对其中的创建对象方法进行不同的实现。
代码:
工厂接口:
public interface IFactory {
ISimple create();
}
工厂实现类:
public class SimpleAFactory implements IFactory {
@Override
public ISimple create() {
return new SimpleA();
}
}
测试类:
@Test
public void fun2() {
ISimple simpleA = new SimpleAFactory().create();
}
在测试类中我们看到了一个new,隐隐感觉不太好,有时我们可以使用反射来实例SimpleAFactory。这时候我们需要将接口IFactory由接口类型改为抽象类类型。
在基类IFactory中:
public static IFactory getFactory(String classname) {
IFactory factory = null;
try {
factory = (IFactory )Class.forName(classname).newInstance();
} catch (ClassNotFoundException e) {
System.err.println("没有找到 " + classname + "类。");
} catch (Exception e) {
e.printStackTrace();
}
return factory;
}
四,抽象工厂模式
工厂方法模式中,一个工厂只能实例化一种产品,如SimpleAFactory只能生产SimpleA类型的产品,但是随着业务需求的发展,我们后来需要在一个工厂中不仅能生产SimpleA类型的产品,也要能生产SimpleC类型的产品(如小米公司最开始生产手机,后来慢慢发展起来也生产笔记本,我们当然也可以新建一个工厂来生产笔记本,这是工厂方法模式,也可以在一个工厂中可以同时生产两种产品,这是抽象工厂模式)。这是就要使用抽象工厂模式了。
代码:
接口:
public interface IFactory {
//生产ISimple类产品
ISimple createSimple();
//生产ISimple2类产品
ISimple2 createSimple2();
}
工厂实现:
//ISimple和ISimple2表示两种不同的产品,
//SimpleA和SimpleC分别是他们的具体实现
public class SimpleAFactory implements IFactory {
@Override
public ISimple createSimple() {
return new SimpleA();
}
@Override
public ISimple2 createSimple2() {
return new SimpleC();
}
}
测试:
@Test
public void fun3() {
ISimple simpleA = new SimpleAFactory().createSimple();
ISimple2 simpleC = new SimpleAFactory().createSimple2();
}
五,工厂方法模式和抽象工厂模式的区别
工厂方法模式是通过类的继承或实现关系来创建产品,并且只能创建一种产品,如果要创建新的产品(如之前生产手机,后来要也能生产笔记本),需要新建一个工厂重载工厂方法以生产新的产品。
抽象工厂模式则是在一个工厂种我们可以同时生产两种产品(如手机和笔记本)。
总结:之上是根据网上的一些博客和百度百科里面对工厂模式的解释所写的。在这里做个笔记。参考的文章中一般都有UML模型图,感觉还是比我总结的好多了。我是来学习的。
参考文章:
设计模式之工厂方法模式|抽象工厂模式