設計模式之簡單工廠/工廠方法/抽象工廠
來源:程序員人生 發布時間:2015-03-18 09:36:02 閱讀次數:2427次
這3個設計模式都屬于創建型模式,之間具有關聯性,就放在1起講授。其實簡單工廠模式是工廠方法的1個特例,其實不是23種設計模式的1種。
使用java來寫的這幾個設計模式。java文件目錄樹以下所示:
zy@zy:~/code/designpattern/SimpleFactory/src$ tree
.
├── Client.java
└── zy
├── abstractfactory
│ ├── AccerFactory.java
│ ├── AppleFactory.java
│ └── ComputerAbstractFactoy.java
├── factory
│ ├── ComputerFactory.java
│ ├── DesktopComputerFactory.java
│ └── LaptopFactory.java
├── product
│ ├── AccerDesktopComputer.java
│ ├── AccerLaptop.java
│ ├── AppleDesktopComputer.java
│ ├── AppleLaptop.java
│ ├── Computer.java
│ ├── DesktopComputer.java
│ └── Laptop.java
└── simplefactory
└── ComputerSimpleFactory.java
5 directories, 15 files
通過1個教研室購買電腦的場景來描寫動機和相應的優缺點。
1個教研室會購買1定數量的電腦來讓學生干活,比較早些的時候購買的是臺式機,
1. 下面看看普通的創建方法。
//Computer.java
package zy.product;
public interface Computer {
void uname();
}
//Laptop.java
package zy.product;
public class Laptop implements Computer {
public void uname()
{
System.out.println("我是筆記本,更加便于攜帶");
}
}
//DesktopComputer.java
package zy.product;
public class DesktopComputer implements Computer {
public void uname()
{
System.out.println("我是臺式機,屏幕更大");
}
}
//1般調用的測試方法
public static void normalTest() {
Computer labComputer1 = new Laptop();
labComputer1.uname();
Computer labComputer2 = new Laptop();
labComputer2.uname();
Computer labComputer3 = new Laptop();
labComputer3.uname();
Computer labComputer4 = new Laptop();
labComputer4.uname();
Computer labComputer5 = new Laptop();
labComputer5.uname();
}
這里,教研室需要5臺筆記本,但是如果過兩年,教研室需要5臺臺式機,那末就需要更改每個創建對象的語句。這樣的可讀性和可保護性都不好。
2. 簡單工廠模式
思路是通過1個簡單的工廠來進行電腦的創建,讓客戶端直接調用工廠來得到電腦,從而自己不用管電腦是如何生產的。 看以下代碼:
//ComputerSimpleFactory.java
package zy.simplefactory;
import zy.product.Computer;
import zy.product.DesktopComputer;
import zy.product.Laptop;
public class ComputerSimpleFactory {
public static Computer createComputer(String computerName) {
if( "Laptop".equals(computerName)) {
return new Laptop();
}
else if( "DesktopComputer".equals(computerName)) {
return new DesktopComputer();
}
else
return new Laptop();
}
}
//簡單工廠的測試方法
public static void simpleFactoryTest() {
//實驗室要5臺筆記本
/*
Computer labComputer1 = ComputerFactory.createComputer("Labtop");
labComputer1.uname();
Computer labComputer2 = ComputerFactory.createComputer("Labtop");
labComputer2.uname();
Computer labComputer3 = ComputerFactory.createComputer("Labtop");
labComputer3.uname();
Computer labComputer4 = ComputerFactory.createComputer("Labtop");
labComputer4.uname();
Computer labComputer5 = ComputerFactory.createComputer("Labtop");
labComputer5.uname();
*/
//實驗室更改需求,要5臺臺式機
Computer labComputer1 = ComputerSimpleFactory.createComputer("DesktopComputer");
labComputer1.uname();
Computer labComputer2 = ComputerSimpleFactory.createComputer("DesktopComputer");
labComputer2.uname();
Computer labComputer3 = ComputerSimpleFactory.createComputer("DesktopComputer");
labComputer3.uname();
Computer labComputer4 = ComputerSimpleFactory.createComputer("DesktopComputer");
labComputer4.uname();
Computer labComputer5 = ComputerSimpleFactory.createComputer("DesktopComputer");
labComputer5.uname();
}
可以看到,直接調用工廠類的靜態方法來生產筆記本就能夠了。統1的接口可讀性更好。并且便于保護。
3. 工廠方法模式
上面的簡單工廠模式,有個缺點就是如果增加了1種電腦的種類,比如超極本。 就需要修改工廠的靜態生產方法,背背了開放-封閉原則,對修改也進行了開放。
針對這個缺點,利用父類和子類之間虛函數的多態性,動態綁定,可以方便的創建對象。代碼以下:
//ComputerFactory.java
package zy.factory;
import zy.product.Computer;
public interface ComputerFactory {
public Computer createComputer();
}
//LaptopFactory.java
package zy.factory;
import zy.product.Computer;
import zy.product.Laptop;
public class LaptopFactory implements ComputerFactory{
public Computer createComputer() {
return new Laptop();
}
}
//DesktopComputerFactory.java
package zy.factory;
import zy.product.Computer;
import zy.product.DesktopComputer;
public class DesktopComputerFactory implements ComputerFactory{
public Computer createComputer() {
return new DesktopComputer();
}
}
//工廠方法的測試方法
public static void factoryTest() {
//原來需求
ComputerFactory factory = new LaptopFactory();
//需求更改:
//ComputerFactory factory = new DesktopComputerFactory();
Computer labComputer1 = factory.createComputer();
labComputer1.uname();
Computer labComputer2 = factory.createComputer();
labComputer2.uname();
Computer labComputer3 = factory.createComputer();
labComputer3.uname();
Computer labComputer4 = factory.createComputer();
labComputer4.uname();
Computer labComputer5 = factory.createComputer();
labComputer5.uname();
}
可以看到,如果增加了1個超極本的種類,不用修改現有的代碼,直接增加1個超極本的工廠便可。并且客戶真個需求代碼,也只用更換1個工廠便可。 比簡單工廠具有更好的可擴大性。 工廠方法模式,又叫做虛構造模式,就是通過這個方法來代替構造函數的作用。
4. 抽象工廠模式
教研室本來是用的宏
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈