设计模式 创建型---工厂模式

家住魔仙堡 提交于 2019-12-22 22:38:58

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

工厂模式,可以分为 简单工厂模式和抽象工厂模式。

一、简单工厂

1.1 简单工厂模式介绍

    1. 简单工厂模式属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定是由以一个工厂对象决定创建哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单使用的模式;
    1. 简单工厂模式:定义一个创建对象的类,由这个类封装实例化对象的行为代码;
    1. 在软件开发过程中,我们会使用到大量的创建某种、某类或者某批对象时我,就会使用到工厂模式。

1.2 简单工厂的优缺点

    1. 有点比较好理解,简单易操作;
    1. 缺点时违反了设计模式的ocp原则(开闭原则),即对外放开、对修改关闭。当我们需要给类增加新功能时,尽量不修改原有代码;

1.3 简单工厂例子

public interface Service {
}

public class Service1Impl implements Service {
}

public class Service2Impl implements Service {
}

public class Service3Impl implements Service {
}

public class SimpleFactory {
    public Service createService(Integer type) {
        if (type == 1) {
            return new Service1Impl();
        } else if (type == 2) {
            return new Service2Impl();
        } else if (type == 3) {
            return new Service3Impl();
        }
        return new Service1Impl();
    }
}

二、工厂方法

2.1 工厂方法简介

工厂方法和行为型设计模式中的模板方法设计模式是重合的。

2.2 工厂方法例子

public abstract class AbstractFactory {
    abstract public Service factoryMethod();

    public void doSomething() {
        Service service = this.factoryMethod();
        // do something with the product
    }
}

public class ConcreteFactory1 extends AbstractFactory {
    @Override
    public Service factoryMethod() {
        return new Service1Impl();
    }
}

public class ConcreteFactory2 extends AbstractFactory {
    @Override
    public Service factoryMethod() {
        return new Service2Impl();
    }
}

public class ConcreteFactory3 extends AbstractFactory {
    @Override
    public Service factoryMethod() {
        return new Service3Impl();
    }
}

UML图中,工厂有部分代码需要针对不同情况单独处理,此时就抽象出接口完成该处理流程。实现让其子类完成,Client业务在调用时还需要另一个工厂类来管理该工厂类,如Mybatis中的sqlSession、sqlSessionFactory、sqlSessionFactoryBuilder之间的关系。

三、抽象工厂

3.1 抽象工厂简介

    1. 抽象工厂模式:定义一个接口interface用于创建相关或有关依赖关系的对象族,而无序具体指名类。
    1. 抽象工厂模式可以看作简单工厂模式工厂方法模式的整合。
    1. 从设计层面看,抽象工厂就是简单工厂的改进(或者称为进一步抽象)。
    1. 将工厂抽象为两层,AbsFactory(抽象工厂)和具体实现的工厂子类,程序员可以根据创建对象类型而使用对应的工厂子类,这样将单个简单工厂变成工厂族,更有利于代码的维护和扩展。

3.2 抽象工厂例子

public abstract class AbstractFactory {

    public abstract AbstractProductA createProductA();

    public abstract AbstractProductB createProductB();
}

public class ConcreteFactory1 extends AbstractFactory {
    @Override
    public AbstractProductA createProductA() {
        return new ProductA1();
    }

    @Override
    public AbstractProductB createProductB() {
        return new ProductB1();
    }
}

public class ConcreteFactory2 extends AbstractFactory {
    @Override
    public AbstractProductA createProductA() {
        return new ProductA2();
    }

    @Override
    public AbstractProductB createProductB() {
        return new ProductB2();
    }
}

public abstract class AbstractProductA {
}

public abstract class AbstractProductB {
}

public class ProductA1 extends AbstractProductA {
}

public class ProductA2 extends AbstractProductA {
}

public class ProductB1 extends AbstractProductB {
}

public class ProductB2 extends AbstractProductB {
}

在我做售后商城的时候,在"订单模块"就用到了抽象工厂设计模式。

四、工程模式小结

工程模式是除了单例模式之外最容易理解和使用的设计模式。也是我们实际工作中常用的设计模式之一。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!