这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. 抽象工厂模式
教研室本来是用的宏