java设计模式之简单工厂模式

简单工厂模式的定义:

  简单工厂模式又叫静态工厂方法模式,简单来说,简单工厂模式有一个具体的工厂类,可以生产出不同的产品,属于创建型设计模式。

简单工厂模式不在GoF23三种设计模式之列

简单工厂模式的应用场景:

  简单工厂模式适合产品种类较少,也就是需要创建的对象较少的情况下运用。使用简单工厂模式创建可以让调用者不必关系对象的创建细节。

简单工厂模式案例:

  比如某电子书商城,读者买了两本书,一本是java相关的,一本是c相关的。我们现在以读者阅读电子书为例,来看看简单工厂模式具体

实现以及用了它有什么好处。以下是代码实现:

 电子书接口:

package com.liuyi.designmode.creational.simplefactory;

/**
 * 电子书接口
 */
public interface EBook {
    /**
     * 阅读方法
     */
    public void read();
}

 

c语言书籍实现:

package com.liuyi.designmode.creational.simplefactory;

/**
 * C语言书籍
 */
public class CBook implements EBook{
    @Override
    public void read() {
        System.out.println("阅读c语言书籍");
    }
}

java书籍实现:

package com.liuyi.designmode.creational.simplefactory;

/**
 * java语言书籍
 */
public class JavaBook implements EBook {
    @Override
    public void read() {
        System.out.println("阅读java语言书籍");
    }
}

创建书籍对象的工厂:

package com.liuyi.designmode.creational.simplefactory;

/**
 * 创建不同种类的电子书的简单工厂类
 */
public class EBookFactory {
    public static EBook createEBook(String type){
        EBook eBook;
        switch (type){
            case "java":
                eBook = new JavaBook();
                break;
            case "c":
                eBook = new CBook();
                break;
            default:
                throw new RuntimeException("当前电子书不存在");
        }
        return eBook;
    }
}

测试类:

package com.liuyi.designmode.creational.simplefactory;

/**
 * 简单工厂模式测试类
 */
public class SimpleFactoryTest {
    public static void main(String[] args) {
        //比如我想读java的书籍
        EBook java = EBookFactory.createEBook("java");
        java.read();
    }
}

  可以看到,调用者不需要知道对象具体是如何创建的就能实现对象的创建,这样做降低了创建对象与程序的耦合性。举个例子,比如我们查看

书的价格的、查看书的总字数,查看书的总页数等等操作的时候,前提条件都需要创建一个对象,这样我们在程序种就会出现很多地方new一个

对象的代码,一旦我们new 对象的代码根据业务的改变发生变化的时候,我们就需要去每个地方都改一遍,这样就和程序的耦合性太高了,不利于

程序的扩展和维护。但是我们用简单工厂模式就不一样了,我们只需要修改工厂类的代码即可完成代码的扩展。

代码优化:

  此时调用者创建对象是很简单了,但是如果商城又上架一本c++类型的书籍,此时就需要修改工厂类的代码了,这显然不符合开闭原则。

因此我们可以用反射的技术继续对简单工厂类进行优化,代码如下:

工厂类修改如下:

package com.liuyi.designmode.creational.simplefactory;

/**
 * 创建不同种类的电子书的简单工厂类
 */
public class EBookFactory {
    public static EBook createEBook(Class<? extends EBook> clazz){
        EBook eBook = null;
        try {
            if(clazz!=null){
                eBook = clazz.newInstance();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return eBook;
    }
}

测试类修改如下:

package com.liuyi.designmode.creational.simplefactory;

/**
 * 简单工厂模式测试类
 */
public class SimpleFactoryTest {
    public static void main(String[] args) {
        //比如我想读java的书籍
        EBook java = EBookFactory.createEBook(JavaBook.class);
        java.read();
    }
}

总结:

简单工厂模式的优点:

  简单工厂模式的结构简单,调用方便。对于外界给定的信息,可以很方便的创建出相应的产品。工厂和产品的职责区分明确。

简单工厂模式的缺点:

  简单工厂模式的工厂类单一,负责所有产品的创建,但当产品基数增多时,工厂类的代码会非常臃肿,违背高聚合原则。

 

posted @ 2020-11-16 00:13  负重前行的小牛  阅读(186)  评论(0编辑  收藏  举报