设计模式之简单工厂/工厂方法/抽象工厂

这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. 抽象工厂模式

教研室本来是用的宏

波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

波比源码 » 设计模式之简单工厂/工厂方法/抽象工厂

发表评论

Hi, 如果你对这款模板有疑问,可以跟我联系哦!

联系站长
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡