zt:工厂模式-简单工厂(设计模式的入门级模式—初级)

 本文综合了《thinking in Design pattern with java》,《Design pattern》,《爪哇语言简单工厂创立性模式介绍》以及我自己的观点,对factory 相关的设计模式进行详细的说明。

工厂模式有以下几种形态:
简单工厂(Simple Factory)模式
工厂方法(Factory Method)模式,又称多形性工厂(Polymorphic Factory)模式
抽象工厂(Abstract Factory)模式,又称工具箱(Kit或Toolkit)模式

以下详细介绍简单工厂模式。

工厂模式是创建型模式,创建型模式抽象了实例化过程。Java中创建对象的方式为使用以下代码:
Book goodBook = new Book();
使用new操作符的短处是事先必须明确知道要实例化的类是什么, 而且实例化的责任往往与使用实例的责任不加区分。上面这句话很难理解,而且大多数人习惯于使用New生命。我们举个例子说明一下工厂的好处:

factory1.png

三个种类的书继承了接口Book,一般情况下声明实例要用到以下代码:
Book chBook = new ChineseBook();
Book enBook = new EnglishBook();
Book jaBook = new JapeneseBook();
这些代码都是大家能理解的,利用多态,我们很好的声明了各种书的实例。建立一个商店买书系统,类图如下:

factory2.png

说明一下:
Shop商店类拥有三种书属性,这些属性将在shop的构造函数中实例化,同时还要实例化用户类,象“书对象”一样,可以生成多个user用户,这并不是我们研究的重点。我们关心如何实例化各个书的实例。
我现实使用了老办法,用New 声明!代码如下:

public class Shop
{
List books = new ArrayList();
String shlist[] = { "ch-a", "ch-b", "en-c", "ja-d",};//书名
public void Shop(){
books.add(new ChineseBook("ch-a"));// ch-a是书的名称
books.add(new ChineseBook("ch-b"));
books.add(new EnglishBook("en-c"));
books.add(new JapeneseBook("ja-d"));//声明了四本书
}
.......
.......
};

四本书被声明完了,得到了四个实例。这样写也用到了很多技巧,似乎无懈可击,可事实上这样写太不合实际了,每当增加一个shlist[]中的元素,都要增加一个new来实例化。仔细观察以下书名”ch-a”与类名”ChineseBook”是很有规律的,完全可以把他们放在一个工厂里加工,产生的成品就是已经实例化完成的书对象了。我们把这个工厂方法放在Shop类中,设成static方法。
把类图稍改一下,可以很明显的看出完美的工厂模型。

factory3.png

具体代码如下:

public class Shop
{
List books = new ArrayList();
String shlist[] = { "ch-a", "ch-b", "en-c", "ja-d",};//书名
public void Shop(){
for(int i = 0; i < shlist.length; i++)
books.add(Shop.bookFactory(shlist[i])); //调用工厂模式
}
public static Book bookFactory(String bookName){ //工厂模式
if(bookName.subString(0,2).equals("ch")) return new ChineseBook(bookName);
if(bookName.subString(0,2).equals("en")) return new EnglishBook(bookName);
if(bookName.subString(0,2).equals("ja")) return new JapeneseBook(bookName);
}
public void sellBook(User someone){
Iterator i = books.iterator(); //跌代模式
while(i.hasNext()) {
Book book = (Book)i.next();
if (book.getName()==someone.needBook()) //以下是具体的逻辑计算,可以不用看
{
book.setUser(someone);
someone.setCash = someone.getCash - book.getPrice();
}
}
.......
cc. Channel.Pattern
.......
}
};

代码中 String shlist[] = { "ch-a", "ch-b", "en-c", "ja-d",};可以随意增加,完全自动化声明。如果增加书的种类,可以直接修改factory方法。工厂模式就是专门负责将大量有共同接口的类实例化,而且不必事先知道每次是要实例化哪一个类的模式。
再回来看看这句话能不能理解“面向对象的设计的目的之一,就是把责任进行划分,以分派给不同的对象。我们推荐这种划分责任的作法, 是因为它和封装(Encapsulation)和分派(Delegation)的精神是相符合的。创立性模式把对象的创立过程封装起来,使得创立实例的责任与使用实例的责任分割开, 并由专门的模块分管实例的创立,而系统在宏观上不再依赖于对象创立过程的细节。”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值