工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类 ,使得一个类的实例化延迟到他的子类。
小工具的python 实现部分代码 markdown 直接贴的代码会乱,我还不懂如何调整,大家将就
highlight: a11y-dark
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 ExportBook(metaclass=abc.ABCMeta):
@abstractmethod
def exportBookApi(self,book):
pass
class ExportBookPdf(ExportBook):
def __init__(self, book):
pass
def exportBookApi(self,book):
print("export pdf file by ExportBookApi ")
print(book.fileExtension)
print(book.bookInfo.url)
class ExportBookMobi(ExportBook):
def __init__(self, book):
pass
def exportBookApi(self,book):
print("export mobi file by ExportBookApi")
print(book.fileExtension)
class ExportBookHtml(ExportBook):
def __init__(self, book):
pass
def exportBookApi(self,book):
print("export html file by ExportBookApi")
print(book.fileExtension)
class ExportBookOperate(ExportBook):
@staticmethod
def exportBookFactory(book):
if isinstance(book, MobiBook):
return ExportBookMobi(book)
elif isinstance(book,PdfBook):
return ExportBookPdf(book)
elif isinstance(book,HtmlBook):
return ExportBookHtml(book)
else:
print("其他格式暂不支持")
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')
bookExport = ExportBookOperate.exportBookFactory(bookCreate)
bookExport.exportBookApi(bookCreate)
运行结果截个图
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("不支持其他格式");
}
}
}
abstract class ExportBook {
exportBookApi(Book book);
}
class ExportBookPdf extends ExportBook {
ExportBookPdf(Book book);
@override
exportBookApi(Book book) {
print("implement of export pdf file");
print(book.fmt);
}
}
class ExportBookHtml extends ExportBook {
ExportBookHtml(Book book);
@override
exportBookApi(Book book) {
print("implement of export html file");
print(book.fmt);
}
}
class ExportBookMobi extends ExportBook {
ExportBookMobi(Book book);
@override
exportBookApi(Book book) {
print("implement of export mobi file");
print(book.fmt);
}
}
class ExportBookFactory {
static ExportBook? exportBookFactory(Book book) {
try {
if (book.runtimeType.toString() == "PdfBook") {
print("pdf book factory");
return ExportBookPdf(book);
} else if (book.runtimeType.toString() == "HtmlBook") {
print("html book factory");
return ExportBookHtml(book);
} else if (book.runtimeType.toString() == "MobiBook") {
print("mobi book factory");
return ExportBookMobi(book);
}
} catch (e) {
print("$e");
}
return null;
}
}
void main(List<String> args) {
BookInfo bi = BookInfo("https://flutter.cn/docs", "nav_item", "content");
Book thisBook = SimpleFactory.createBook(bi, "html");
thisBook.makeBook();
print("---------------------------------------");
ExportBookFactory.exportBookFactory(thisBook)?.exportBookApi(thisBook);
}
运行结果