设计模式一简单工厂模式:边学边做个生成电子书的工具(python+dart)

156 阅读2分钟

前几天有事耽误了几天,后面慢慢补回来。中年人杂事多,精力也不够。尽量找找年轻时候的兴趣劲吧。 前面捣鼓了看代码的工具,有个想法可以边做小小的工具,边手写一些设计模式的代码实现,看看就在这个小工具上硬套实现,就是不考虑是否是过度的那种,尽量用两种语言实现,主要目的是熟悉学习吧。

小工具的实现可能最终不是给普通人用的(主要是python实现,dart是顺带打酱油的),不过给前端熟悉的程序猿 从网页生成 pdf mobi应该是没问题的,只要您懂里面有几个参数哪里来的。主要是把网站里的 docs的那种 页面生成 pdf , mobi。例如 网站flutter.cn/docs

生成的mobi文档效果如下图

a7d05161d0c2b700cd399d87a583295.jpg

重点记录下学习的代码片段和dp的思想吧

简单工厂模式

image.png

根据参数输入 文件格式不同 生成不同的文件,部分接口使用的列子代码

python实现

import abc
from abc import *

class BookInfo(object):
    url = ""
    navItemContent = ""
    content = ""

    def __init__(self, url, navItem, content):
        self.url = url
        self.navItemContent = navItem
        self.content = content

class Book(metaclass=abc.ABCMeta):
    bookInfo = ""
    fileExtension = ""
    name = ""

    def __init__(self, bookInfo, fmt):
        self.bookInfo = bookInfo
        self.fileExtension = "." + fmt
        self.name = self.calcBookName(fmt)
        self.prepare()

    @abstractmethod
    def makeBook(self):
        '''
        makeBook
        :制作电子书:
        '''

    def calcBookName(self, fmt):
        '''
        从参数里面计算出书的名字
        :return:
        '''
        print(self.bookInfo.url)
        filenameTempString = self.bookInfo.url.split("//")[1]
        filenameTempString = filenameTempString.replace(".", "_")
        filenameTempString = filenameTempString.replace("-", "_")
        filenameTempString = filenameTempString.replace("/", "_")
        file_name = filenameTempString + self.fileExtension

        return file_name

    def prepare(self):
        """
        准备工作
        :return:
        """
        # print(__doc__)
        print(self.name)


class PdfBook(Book):
    """
    pdf book
    """
    def makeBook(self):
        """
        make pdf book func
        :return:
        """
        print(PdfBook.__doc__)


class MobiBook(Book):
    """
    Mobi book
    """
    def makeBook(self):
        """
        make mobi book func
        :return:
        """
        print(MobiBook.__doc__)


class HtmlBook(Book):
    """html book """

    def makeBook(self):
        """
        make html book func
        :return:
        """
        print(HtmlBook.__doc__)


class SimpleFactory(object):
    """
    简单工厂
    """

    @staticmethod
    def createBook(bookInfo, fmt):
        """
        简单工厂
        :param bookInfo:
        :param fmt:
        :return:
        """

        if 'pdf' in fmt:
            print("create pdf factory")
            return PdfBook(bookInfo, fmt)
        elif "mobi" in fmt:
            print("create mobi file")
            return MobiBook(bookInfo, fmt)
        elif 'html' in fmt:
            print("create html file")
            return HtmlBook(bookInfo, fmt)
        else:
            print("暂时支持pdf 和mobi和html")


print("test now")
bookInfo = BookInfo("https://flutter.cn/docs", "nav_item", "content")
bookCreate = SimpleFactory.createBook(bookInfo, 'pdf')
bookCreate.makeBook()

运行结果

image.png

dart实现

class BookInfo {
  String url = "";
  String content = "";
  String navItem = "";
  BookInfo(this.url, this.navItem, this.content);
}

class Book {
  BookInfo bookInfo;

  String fmt;

  Book(this.bookInfo, this.fmt) {
    print("init bookInfo");
  }

  makeBook() {
    print("make book" + fmt);
  }
}

class HtmlBook extends Book {
  HtmlBook(BookInfo bookInfo, String fmt) : super(bookInfo, fmt);

  @override
  makeBook() {
    print("html file  override xxxxxxxxxxxxxxxxxxxx");
    return super.makeBook();
  }
}

class PdfBook extends Book {
  PdfBook(BookInfo bookInfo, String fmt) : super(bookInfo, fmt);

  @override
  makeBook() {
    print("pdf file");
    return super.makeBook();
  }
}

class MobiBook extends Book {
  MobiBook(BookInfo bookInfo, String fmt) : super(bookInfo, fmt);
  @override
  makeBook() {
    print("mobi book");
    return super.makeBook();
  }
}

class SimpleFactory extends Object {
  static createBook(BookInfo bookInfo, String fmt) {
    if (fmt.endsWith("pdf")) {
      print(" pdf xxx");
      return PdfBook(bookInfo, fmt);
    } else if (fmt.endsWith("html")) {
      print(" html xxx");
      return HtmlBook(bookInfo, fmt);
    } else if (fmt.endsWith("mobi")) {
      print(" mobi xxx");
      return MobiBook(bookInfo, fmt);
    } else {
      print("不支持其他格式");
    }
  }
}

void main(List<String> args) {
  BookInfo bi = BookInfo("https://flutter.cn/docs", "nav_item", "content");

  Book thisBook = SimpleFactory.createBook(bi, "html");
  thisBook.makeBook();
}

image.png

因为可能最终是用python做出可以用的小工具,python部分实现更真实一些。 时间不早 先休息。