程序员人生 网站导航

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

栏目:php教程时间:2015-03-18 09:36:02

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

教研室本来是用的宏

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐