Java设计模式之工厂模式及实例
一、What&Why
工厂模式(Factory Pattern) 是Java中最常用的设计模式之一。在工厂模式中,我们在创建对象是不会对客户端暴露创建逻辑,并且通过使用一个共同的接口来指向新创建的对象,创建过程在其子类中执行。
在工厂模式下如果想增加产品,只要扩展工厂类就可以了,这样提高了系统的可扩展性;对调用者来说,屏蔽了产品的具体实现,只为其提供接口,降低了系统的耦合性。
耦合性也叫块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块之间越独立则越差,模块间耦合的高低取决于模块间接口的复杂性,调用的方式以及传递的信息。
二、Sample
在星云图书馆购买图书时有三种赠品可以选择,分别是:CD
、包装袋
和钢笔
。我们创建一个附赠品工厂类,一个附赠品抽象类,三种附赠品各对应一个子类继承与附赠品抽象类。
1. 附赠品工厂类
只有一个创建附赠品的静态方法creat(int id)
,返回值是一个附赠品对象
public class ExFactory {
public static EX create(int id) {//使用静态方法提高运行效率
switch(id) {
case 1:
return new CD();
case 2:
return new Pen();
case 3:
return new Bag();
default:
return null;
}
}
}
2. 附赠品类(抽象类)
public abstract class EX {
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getEx_name() {
return ex_name;
}
public void setEx_name(String ex_name) {
this.ex_name = ex_name;
}
private double price; //价格
private String ex_name; //名称
public double cost() {
System.out.print("附赠品:");
System.out.print(ex_name+":"+price);
System.out.println("===============");
return price;
}
}
3. 三个子类
(1)CD
public class CD extends EX{
public CD() {
this.setEx_name("CD");
this.setPrice(10.00);
}
}
(2)Pen
public class Pen extends EX{
public Pen() {
this.setEx_name("钢笔笔");
this.setPrice(20.00);
}
}
(3)Bag
public class Bag extends EX{
public Bag() {
this.setEx_name("包装袋儿");
this.setPrice(1.50);
}
}
三、使用
在测试类里,购买附赠品时有这样一段代码:(可忽略无关代码逻辑)
System.out.print("1.CD 27.50元 2.包装 2.70元 3.钢笔 10元 4.不需要");
System.out.println("请输入需要购买的附赠品:");
int exCode = input.nextInt();
if (exCode >= 1 && exCode <= 4) {
//使用工厂模式的create()函数生成一个所选择的附赠品对象
EX ex = user.buyEx(exCode);
book.setEx(ex);
user.checkout(book);
}
这样,只用一行简单的语句,就构造出了一个附赠品对象,无须传价格等参数,隐藏了许多创建逻辑。如果之后书店又推出新的附赠品(比如便签纸
),只需要再写一个子类继承EX类、在create()
函数的switch语句
里增加一个case
即可。