【重温设计模式】工厂设计模式

一.介绍

工厂设计模式的分类

1.简单工厂模式
2.工厂方法模式
3.抽象工厂模式


工厂设计模式.jpg

工厂设计模式在工作中的应用

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(); 

    }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。