一.介绍
工厂设计模式的分类
1.简单工厂模式
2.工厂方法模式
3.抽象工厂模式
工厂设计模式在工作中的应用
1.spring中通过getBean(“xxx”)获取bean对象,其实就是从BeanFactory中获取对象,BeanFactory最常见的实现类有AnnotationConfigApplicationContext和ClassPathXmlApplicationContext这两种。
2.Mybatis中的SqlSessionFactory,从工厂中获取SqlSession对象操作数据库。
为什么使用工厂模式
1.解耦
将对象的创建和使用分开
2.降低代码重复
如果创建对象的过程过于复杂,需要一定的代码量,而且这段代码在很多地方都用到了,就可以利用工厂模式,将创建对象的过程交给工厂,降低代码的重复性。
3.降低维护成本
对象的创建过程全部交给工厂统一管理,所以在创建对象的代码的业务逻辑发生变化时,不需要逐个的去修改,只需要在工厂中修改代码,就可以达到统一修改的目的,降低了维护成本。
二.3种工厂模式详解
1.简单工厂模式
简单工程模式是工厂模式的一个特殊实现,它只适应与一些简单的情况,但是违背了开闭原则,每次需要添加一个工厂产出的对象种类都需要修改已有的代码。
代码示例:
创建一个可以绘制不同形状的绘图工具,可以绘制圆形,正方形,三角形,每个图形都会有一个draw()方法用于绘图.(实体类略)
public class ShapeFactory {
// 使用 getShape 方法获取形状类型的对象
public static Shape getShape(String shapeType) {
if (shapeType == null) {
return null;
}
if (shapeType.equalsIgnoreCase("CIRCLE")) {
return new Circle();
} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
return new Rectangle();
} else if (shapeType.equalsIgnoreCase("SQUARE")) {
return new Square();
}
return null;
}
}
这样的实现有个问题,如果我们新增产品类的话,就需要修改工厂类中的getShape()方法,这很明显不符合 开放-封闭原则 。
但我们,可以通过 反射+配置文件 的形式来改善,相信你已经会了,略...
2.工厂方法模式
工厂方法模式是简单工厂的进一步深化, 在工厂方法模式中,我们不再提供一个统一的工厂类来创建所有的对象,而是针对不同的对象提供不同的工厂。也就是说 每个对象都有一个与之对应的工厂 。
(1)增加一个工厂接口:
public interface Factory {
public Shape getShape();
}
(2)增加相关工厂类:
public class CircleFactory implements Factory {
@Override
public Shape getShape() {
// TODO Auto-generated method stub
return new Circle();
}
}
(3)测试
public class Test {
public static void main(String[] args) {
Factory circlefactory = new CircleFactory();
Shape circle = circlefactory.getShape();
circle.draw();
}
}
3.抽象工厂模式
抽象工厂模式是工厂方法的仅一步深化,在这个模式中的工厂类不单单可以创建一种产品,而是可以创建一组产品。
抽象工厂是生产一整套有产品的(至少要生产两个产品),这些产品必须相互是有关系或有依赖的,而工厂方法中的工厂是生产单一产品的工厂。
下面就是抽象工厂图示:
(1)创建相关接口:
枪
public interface Gun {
public void shooting();
}
子弹
public interface Bullet {
public void load();
}
(2)创建接口对应实现类:
AK类
public class AK implements Gun{
@Override
public void shooting() {
System.out.println("shooting with AK");
}
}
M4A1类
public class M4A1 implements Gun {
@Override
public void shooting() {
System.out.println("shooting with M4A1");
}
}
AK子弹类
public class AK_Bullet implements Bullet {
@Override
public void load() {
System.out.println("Load bullets with AK");
}
}
M4A1子弹类
public class M4A1
_Bullet implements Bullet {
@Override
public void load() {
System.out.println("Load bullets with M4A1");
}
}
(3)创建工厂接口
public interface Factory {
public Gun produceGun();
public Bullet produceBullet();
}
(4)创建具体工厂
生产AK和AK子弹的工厂
public class AK_Factory implements Factory{
@Override
public Gun produceGun() {
return new AK();
}
@Override
public Bullet produceBullet() {
return new AK_Bullet();
}
}
生产M4A1和M4A1子弹的工厂
public class M4A1_Factory implements Factory{
@Override
public Gun produceGun() {
return new M4A1();
}
@Override
public Bullet produceBullet() {
return new M4A1_Bullet();
}
}
(5)测试
public class Test {
public static void main(String[] args) {
Factory factory;
Gun gun;
Bullet bullet;
factory =new AK_Factory();
bullet=factory.produceBullet();
bullet.load();
gun=factory.produceGun();
gun.shooting();
}
}