/*书籍工厂*/publicenum BookFactory {
BOOK_FACTORY;public Book createBook(String bookType){
Book book = null;if("poetry"== bookType){//诗歌
book =newPoetryBook();}elseif("novel"== bookType){//小说
book =newNovelBook();}elseif("prose"== bookType){//散文
book =newProseBook();}if(book != null)
book.printType();return book;}}
/*订单工厂*/publicenum OrderFactory {
ORDER_FACTORY;public Order creatOrder(String orderWay, String itemType, Book book){
Order order = null;if("book"== itemType){
order =newBookOrder();
order.setOrderWay(orderWay);((BookOrder) order).setOrderBook(book);}elseif("pen"== itemType){
order =newPenOrder();}else{
System.out.println("目前只支持书籍和笔订购!");}return order;}}
由于订单与书籍在设计时的思路相似,此处不再累述。
在上层的书店,此处不再做商城化假设。只假定只有一家,因此书店在系统中,也可以使用单例模式:
publicenum BookStore {
BOOK_STORE;publicstatic Order creatOrder(String orderWay, String itemType, String bookType){
Order order = OrderFactory.ORDER_FACTORY.creatOrder(
orderWay,// 线上还是线下订单
itemType,// book or pen
BookFactory.BOOK_FACTORY.createBook(bookType)// 遵循迪米特法则,尽量不要在局部变量中出现陌生类);return order;}}
在模拟客户端,进行书籍的下单操作:
/*购买书籍的入口*/publicclassBuyBook{publicstaticvoidmain(String[] args){
Order order1 = BookStore.creatOrder("onLine","book","poetry");
Order order2 =BookStore.creatOrder("offLine","book","novel");}}
最终执行时,会调用各个书籍类子类实现的基类的printType方法,打印如下内容:
该诗歌集在全球范围发行!
该小说适合青少年阅读!
到此,我们便实现了一个单例模式枚举法与简单工厂模式的简单组合运用。
顺便一提,简单工厂模式常用,但又不属于23种设计模式之一。
大多数朋友的争论点在于简单工厂模式违背了设计模式七大原则的开闭原则(Open Close Principle OCP)。