�f�U�C���p�^�[���Ƃ́A�����̗ǂ��v���O���~���O�����邽�߂ɁA�悢�\�[�X�R�[�h���p�^�[�����������̂ŁAGoF��23�̃p�^�[�����悭�m���Ă��܂��B�f�U�C���p�^�[�����g�p���邱�ƂŁA�ė��p���̍����A�����e�i���X���ɗD�ꂽ�R�[�h���������Ƃ��ł��A�p�^�[�����̂��g�����ƂŁA�v���O���}�Ԃł̃R�~���j�P�[�V�������X���[�Y�ɂȂ�Ƃ����܂��B
���̃y�[�W�ł́A�f�U�C���p�^�[���̏Љ�E����ł͂Ȃ��A������Ƃ����R�����g�E�ᔻ�����ꂼ��ɏ����Ă����܂��B
�Ȃ̂ŁA�����ł͂��łɃf�U�C���p�^�[���ɂ��Ă�����x�w��ł���l��ΏۂƂ��܂��B�e�f�U�C���p�^�[���ɂ��ďڍׂ͉�����Ȃ��̂ŁA�ȉ��̃T�C�g��{���Q�l�ɂ��Ă��������B�l�ɂ���āA���߂��قȂ��Ă�����̂�����܂��B
�@�T�C�g GOF�̃p�^�[���ɂ��� Java��HelloWorld�@�f�U�C���p�^�[�� �f�U�C���p�^�[�� Java����Ŋw�ԃf�U�C���p�^�[������ �f�U�C���p�^�[���̊[������ Java�v���O���}�̂��߂̃f�U�C���p�^�[������ �@���� �w�I�u�W�F�N�g�w���ɂ�����ė��p�̂��߂̃f�U�C���p�^�[���x �wJava����Ŋw�ԃf�U�C���p�^�[������x �wJava����Ŋw�ԃf�U�C���p�^�[������ �}���`�X���b�h�ҁx �w�I�u�W�F�N�g�]�̂�����\Java�EUML�EEJB���}�X�^�[���邽�߂̋��ɂ̊�b�u�� Be Agile!�x �wJava�f�U�C���p�^�[���O��U�� �W���v���O���}�[�Y���C�u�����x �w�ƏK�f�U�C���p�^�[���x
�f�U�C���p�^�[���ɂ��ĂQ�R�p�^�[������ƌ���܂����A�悭�ǂݍ��߂A�ގ��������̂������ł��B�Ȃ����̃p�^�[�������グ����̂��Ƌ^��Ɏv�����Ƃ�����܂��B
GoF��23�p�^�[�������̂܂܉�����Ă���{�������A���ׂ��Ȑ����邩�̂悤�Ɍ����邹�����A�������Ė{���������Â炭�Ȃ��Ă����ۂ�����܂��B23�p�^�[�������ׂĂł͂Ȃ����A���̃p�^�[�����̃p�^�[���������n�߂������ɏo���ꂽ���̂ŁA��������Ă��Ȃ��Ǝv���̂ł��B�u�����p�^�[���v�ƌ�����Ɖ�������ȃe�N�j�b�N�Ȃ̂��ƍl���Ă��܂��A�������ē���Ƃ炦�Ă���̂ł͂Ȃ��ł��傤���B
���������āA�N���X�v�̏�ʃ��x���̃R���Z�v�g�ƁA�R�[�f�B���O�̃e�N�j�b�N����������ɂ����悤�Ȉ�ۂ�����܂��B
���̈�ۂł͂���Ȋ����ł��B
�E��ʃR���Z�v�g�i���܂�ɂ��p�r����̓I�߂���j Strategy Command State Interpreter �E��ʃR���Z�v�g�i�N���X�\���̕��@�ł����ăe�N�j�b�N�ł͂Ȃ��B���R�Ɏg�����́j Factory Method Abstract Factory Builder Proxy Facade Memento Prototype Template Mediator Observer Bridge �E�e�N�j�b�N�i�𗧂��̂����邪�A���܂�g��Ȃ����̂�����j Singleton FlyWeight Adaptor Composite Iterator Visitor Decorator ChainOfResponsibility
�����23�̃p�^�[���̂����A�����I�Ƃ�����͍̂Ō�̂��̂����ŁA���͕��ʂɃN���X�v���Ă���Ώo�Ă�����̂ł����ăp�^�[���Ɩ��Â���قǂ̂��̂ł͂Ȃ��C�����܂��BSingleton��Flyweight�͂�����Ƃ����e�N�j�b�N�ł����āA�p�^�[���Ƃ��������C�f�B�I���Ƃ����������K�ȋC�����܂��B
�悭�A�f�U�C���p�^�[�������̂܂ܓK�p�ł��Ȃ��Ƃ����ӌ�������܂����A��������̂͂��ŁA�������Ă���̂̓N���X�\���ɂ�������ɂ����܂���B�����ɓ��Ă͂߂āA�u���̃A�v���P�[�V�����ɂ́����̃f�U�C���p�^�[�����g���Ă���v�ȂǂƎ�������͈̂Ӗ����Ȃ����A�ׂ������͂��āuStrategy��State�̈Ⴂ�͂����ł���v�Ȃǂƌ����Ώۂɂ���̂��Ӗ����Ȃ��Ǝv���܂��BGoF�̗�ɍ��v���Ă��Ȃ�������ʂ������Ǝv���̂��ԈႢ�ł��B
�ʏ�́A�ȉ��̂悤�ɂɂQ�R�̃f�U�C���p�^�[���ނ��Ă��܂����A����������p�x���番�ނ������Ǝv���܂��B
�@ | �ړI | |||
���� | �\�� | �U�镑�� | ||
�͈� | �N���X | Factory Method | Adapter | Interpreter Template |
�I�u�W�F�N�g | Abstract Factory Builder Prototype Singleton |
Adapter Bridge Composite Decorator Facade Flyweight Proxy |
Chain of Responsibility Command Iterator Mediator Memento Observer State Strategy Visitor |
�����̕���
�E�|�����[�t�B�Y���i�T�u�N���X�ɂ���ւ��j Template Factory Method Strategy Command State Bridge Composite Interpreter ChainOfResponsibility �E���� Abstract Factory Builder Facade Mediator �EWrapper Adapter Proxy Decorator Memento �E�@�\���U Observer Visitor Iterator �E�C���X�^���X���L Singleton FlyWeight Prototype
���܂Ƃ߁�
�@ | �|�����[�t�B�Y�� | ���� | �@�\���U | ���� | Wrapper | �C���X�^���X�ێ� |
Template | �� | �@ | �@ | �@ | �@ | �@ |
Factory Method | �� | �� | �@ | �@ | �@ | �@ |
Strategy | �� | �@ | �@ | �@ | �@ | �@ |
Command | �� | �@ | �@ | �@ | �@ | �@ |
State | �� | �@ | �@ | �@ | �@ | �@ |
Composite | �� | �@ | �@ | �@ | �@ | �@ |
Interpreter | �� | �@ | �@ | �@ | �@ | �@ |
Bridge | �� | �@ | �@ | �� | �@ | �@ |
ChainOfResponsibility | �� | �@ | �@ | �@ | �@ | �@ |
Abstract Factory | �� | �� | �� | �� | �@ | �@ |
Builder | �@ | �� | �� | �� | �@ | �@ |
Facade | �@ | �@ | �� | �� | �@ | �@ |
Mediator | �@ | �@ | �� | �� | �@ | �@ |
Adaptor | �@ | �@ | �@ | �� | �� | �@ |
Proxy | �@ | �@ | �@ | �� | �� | �@ |
Decorator | �@ | �@ | �@ | �@ | �� | �@ |
Memento | �@ | �@ | �@ | �@ | �� | �� |
Observer | �� | �@ | �� | �� | �@ | �@ |
Visitor | �� | �@ | �� | �� | �@ | �@ |
Iterator | �@ | �@ | �� | �� | �@ | �@ |
Singleton | �@ | �� | �@ | �@ | �� | �� |
FlyWeight | �@ | �� | �@ | �@ | �� | �� |
Prototype | �@ | �� | �@ | �@ | �� | �� |
�����ɕ��ނ����̂́A�I�u�W�F�N�g�w���̑�R�����A�|�����[�t�B�Y�����g�p�����p�^�[���ł��B�|�����[�t�B�Y�����g�p����ƁA���I�Ɏg�p����N���X���ւ��邱�Ƃ��ł��܂��B���Q�Ɓ�
���ɕ��ނ���Ă�����̂ł��A�|�����[�t�B�Y�����d�v�Ȉʒu���߂Ă�����̂�����܂����A�����ł͂��ꂵ���g���Ă��Ȃ����̂������܂��B
�����f�U�C���p�^�[���S�̂�ʂ��ċ�������Ă���̂́A�C���^�[�t�F�[�X�Ńv���O���~���O�����Ƃ������Ƃł��B�����ւ̈ˑ����Ȃ����A�������邱�Ƃɂ���Đv�̍��g�݂𖾂炩�ɂ���̂ł��B
���̂悤�ȃ��\�b�h���������ꍇ�ɁA����B�̂Ƃ���������ɂ���ĕς������ꍇ������Ƃ��܂��B
class Hogehoge { void doit() { ... ����A ... ... ����B ... ... ����C ... } }
���@�Ƃ��ẮA
�P�Dif�������B
�Q�D�T�u�N���X������ă|�����[�t�B�Y���ɂ���B
���l�����܂��B
�P��K�p����ꍇ�A
void doit() { ... ����A ... if (hoge == 1) { ... ����B ... } else { ... ����B' ... } ... ����C ... }
�̂悤�ɁAif����lj����ď�������ł��傤�B�������A���̏ꍇ�A��������Α�����قǁA���̓s�x�Aelse if����lj����Ȃ���Ȃ�Ȃ��Ȃ�܂��B
�Q�̏ꍇ�́A����B�̂Ƃ�����A�ς��āA
void doit() { ... ����A ... execute(); ... ����C ... } void abstract execute();
�Ƃ��āA�T�u�N���X�Ɏ���������悤�ɂ��܂��B�T�u�N���X�����猩��A����ȊO�̂Ƃ���͋��ʏ����ƂȂ��Ă��邽�߁A���̏����̗��ꂪ��̃e���v���[�g�ɂȂ��Ă��܂��B
���ہA�v�̒i�K�ōŏ�����A���̍\����g�ݍ��ނ��Ƃ������A�e�������ƂɎ����N���X���A�e�N���X���A
void execute() { init(); inputCheck(); execMain(); } void abstract init(); void abstract inputCheck(); void abstract execMain();
�Ƃ��āA���������ʉ������܂��i���̏ꍇ�A�e�N���X�ł̓��\�b�h���Ăԏ��������K�肵�āA�e���\�b�h�̏����̓T�u�N���X�ɔC���܂��j�B
�C���X�^���X�̐������������g�ł͌��肹���A�T�u�N���X�ɔC���܂��BAbstract Factory�ƈႢ�AFactory�N���X���g���l�������Ă��܂��BTemplate���\�b�h�ɗގ����Ă��܂����A������͂��̃��\�b�h���C���X�^���X�����݂̂��s���A�����ɏd�_���u����Ă��܂��B
class Hogehoge { void doit() { List list = new Vector(); list.add(foo); .... } }
���̂Ƃ��AVector���g�p���邩�ǂ������߂��Ȃ��ꍇ�A�������\�b�h�����ɂ��Ď����̓T�u�N���X�ōs���܂��B
abstract class Hogehoge { void doit() { List list = create(); list.add(foo); .... } abstract List create(); } class HogeAList extends Hogehoge { List create() { return new ArrayList(); } }
�ȉ��́AStrategy�AState�ACommand�́A�g����͈Ⴂ�܂����A�P�ɐ�ւ��N���X���헪�Ȃ̂��A��ԂȂ̂��A�R�}���h�Ȃ̂��̈Ⴂ�����ł��B����̓N���X�\����̃e�N�j�b�N�Ƃ������́A�����I�u�W�F�N�g�Ƃ��Ď��o�����Ƃ����w�j�ɉ߂��܂���B
�헪�i�A���S���Y���j���N���X�����āA���s���ɂǂ̐헪���g������I�����āA�I�������N���X�̃��\�b�h���g���܂��B
��Ԃ��N���X�ɂ��ĉ��ʂ肩�̏�Ԃ̃N���X�̒��ŁA��Ԃɉ����Ď��s���郁�\�b�h��ς��܂��B
�R�}���h�i�����A�̏�����v���j���I�u�W�F�N�g���āA�ǂ̏������g�������ɉ����Đ�ւ��܂��B
�O�̂Q�p�^�[�����Œ�I�ł���̂ɑ��A�R�}���h�p�^�[���̏ꍇ�́A�R�}���h�I�u�W�F�N�g�̈������y���A���N�G�X�g�Ƃ��đ���o������A�e�ՂɌ���������A�����^��A���������s�������肵�܂��B�����̃R�}���h���L���[�ɓ���ď��X�ɌĂяo���悤�ɂ�����Aundo��redo�ɓK�p�����肵�܂��B
�@�\�Ǝ���������p�^�[���ł��B����͒ʏ�̃C���^�[�t�F�[�X�Ǝ����N���X�̕����̂��Ƃ������Ă���̂ł͂���܂���B�����Ō����u�����v�Ƃ́A�Ⴆ��Windows��UNIX�œ������������������������قȂ��Ă��܂��ꍇ��A���������ł��A���S���Y�����ւ������ꍇ�Ȃǂ��w���Ă��āA�������e�͓����ł��B����ɑ��āA�@�\�̕��́A�s�����������ꂼ��قȂ��Ă��܂��B
�ꌩ���ʂȃe�N�j�b�N�Ɍ����܂����A���ۂ̂Ƃ���A��������ޕ������āA�K�w�����Ă��邾���ł��B�ŏ��Ɏ��A�̒��̂ǂꂩ�̃N���X���Ăяo����A����������B�̒��̂ǂꂩ�̃N���X���Ăяo�����`�ɂȂ��Ă��܂��B�܂�|�����[�t�B�Y�����Q��s���Ă��邾���ł��B�������A��4����A���B��3�������ꍇ�A�P��̃|�����[�t�B�Y�����g���ꍇ�A�e�N���X1 + �q�N���X4 �~ 3 �� 13�̃N���X���K�v�ɂȂ�܂����ABridge�p�^�[�����g���Ɛe�N���X2 �{ �q�N���X(4+3) = 9�ōς݁A�܂����ʂ����悭�Ȃ�܂��B
�ȉ��̂Q�̃p�^�[���͂��̃��\�b�h�̒��ł���ɑ��̃N���X�̃��\�b�h���Ăяo������A�ċA�Ăяo��������̂Ŏ���G�ł����A��{�I�ȃR���Z�v�g�̓N���X�Q���C���^�[�t�F�[�X�ň������Ƃɂ���܂��B�|�����[�t�B�Y���Ǝ������g���Ăяo����@���~�b�N�X�������̂ł��B�N���X�\�����ċA�\���Ƃ��č�����ۂɁA�|�����[�t�B�Y����K�p���Č�������}�낤�Ƃ���p�^�[���ł��B
����́A�f�B���N�g���̍\���̂悤�ɁA�e��ƒ��g�ꎋ����p�^�[���ł��B�f�B���N�g���ɂ̓f�B���N�g�����t�@�C�����i�[�ł��A���ꂪ�ċA�I�ȍ\�����Ȃ��܂��B�����ł́A�e��ƒ��g�ɓ����C���^�[�t�F�[�X��ł���̂������ŁA�|�����[�t�B�Y���ɂ���ւ����g���Ă��܂��B
�ċA�\���ł����Ă��A�e��ƒ��g�ꎋ���Ȃ��ꍇ�́AComposite�p�^�[���ł͂���܂���B�ċA�\�����̂́A�I�u�W�F�N�g�w���łȂ��Ă��p�����A���郁�\�b�h���������g���Ăяo���Ƃ����`�Ŏg���܂��B���̂Ƃ��e�킩���g���f������������g���Ă���̂ł����AComposite�p�^�[�����g�����ƂŁA���̏�������r�����A�|�����[�t�B�Y���ɂ���āA�e��ƒ��g�ɂ����s���e�̈Ⴂ���������܂��B
Interpreter�́A���炩�̃t�H�[�}�b�g�ŏ����ꂽ�t�@�C���̒��g����͂������ʂɓK�p����p�^�[���ł��B��͂�����@�ł͂Ȃ��A��͂������ʂ𗘗p����p�^�[���ł��B
���̃t�H�[�}�b�g�Ƃ́Ahtml��xml�A�v���p�e�B�t�@�C���̂悤�ȐÓI�Ȃ��̂�����A�\�[�X�t�@�C���̂悤�ɏ����菇���L�q�������̂�����܂��BSQL�A�V�F���A�o�b�`�A�}�N���AXSLT��������܂��B�ʏ�A�p�[�X�Ƃ�������ŁA���@�K���ɂ̂��Ƃ��ĉ�͂��s�Ȃ��A��͌��ʂ̓c���[�\���̃I�u�W�F�N�g�Ƃ��ĕۑ�����܂��B�S�͕̂�������\������A�����͂���ɏ����ȕ�������\������܂��B
�S�̂ɑ��ĉ��炩�̃��\�b�h��K�p����ƁA�����ɑ��Ă������ċA�I�ɓ������\�b�h���Ăяo���Ă����܂��B��{�I�ɁAInterpreter��Composite�Ɠ������̂ł��B
�����ʏ�AComposite��Interpreter��K�p����p�^�[���͑�������܂���B�ċA�I�ɏ�������̂��֗��Ȃ̂́A�����ɊK�w���[���Ȃ�\��������ꍇ�ŁA�ꗗ�\����v�Z�⏈�����s���ꍇ�ł��B�e��̒��ɗe���������悤�ɂ���A�ċA�\�����ł�������܂����A�ݒ�t�@�C���Ȃǂŗp����ꍇ�͂������č����������܂��B�����ɊK�w���[���Ȃ��Ă��A���p����A�v���P�[�V�������őΉ�����K�v���o�Ă���̂ŁA�L���̍\���ɂ������������̂ł��B
�Ⴆ�Aconfig�t�@�C��������܂��B
config property.1=aaa category1 ( property.2=zzz category2 ( property.1=bbb property.2=123 ) ) category3 ( property.2=ccc property.3=456 )
������I�u�W�F�N�g�Ɏ�荞�ނɂ́A
class Config { Category[] category; Property[] property; } class Category { String name; Category[] category; Property[] property; }
�Ƃ��������ŁA��ł���Category��Category���܂ނ悤�ɂ���Ζ����̊K�w���ł��܂��B���ꂪ�L���Ȃ̂́A�S�̂��邢�͈ꕔ���ň�A�̏������s���ꍇ�����ŁACategory�����邢��Property���ɉ����ď�����ς���ꍇ�́AComposite��Interpreter�p�^�[���̓K�p�͕��G�ɂȂ�܂��B�܂�����Ė����K�w������Ă��܂����͗L���̍\���ɂ��������ԈႢ�����Ȃ�����܂���B
�܂��ċA�\���̐�����������܂��B�t�@�C���V�X�e���Ȃǂ̏ꍇ�ōċA�I�ɏ�������̂́A���X�g�Ƃ��ăv�����g�A�E�g����ꍇ��t�@�C���T�C�Y�����v������A�R�s�[����Ȃǂ̗p�r�ł��B���������ꍇ�́A�p�^�[����K�p���Ē��g�Ɗ�ꎋ����̂������ł��傤�B
�܂��A��A�̌v�Z�⏈�����s���ꍇ�ł����A�Ⴆ�A
3 - 5 + 6 * 5 * (6 - 5)
�Ƃ����v�Z������ꍇ�A�܂��ȉ��̂悤�ȍ\���ɕ����i�p�[�X�j���܂��B-�͒l�Ɋ܂߁A�m�[�h�́{��~�̃I�y���[�^�ƒl�ł���I�y�����h����Ȃ�܂��B
�I�y���[�^�͊��Ɠ���ɂ݂Ȃ��āA���ɂԂ牺�����Ă���m�[�h�������Ƃ��Č����Ă܂��B�{��~�͉ψ����ł��B�����̐������肳�ꂽ��������ݏ�Ȃǂ̊�������Ă��悢�ł��傤�B
�S�̂̌v�Z������ɂ́A���[�g�m�[�h�ɃA�N�Z�X���A�m�[�h���I�y���[�^�ł���ꍇ�́A�q�m�[�h��ǂݍ���Ōv�Z���s���܂��B�q�m�[�h���I�y���[�^�̏ꍇ�͂���ɂ��̎q�m�[�h�ɑ��ē������Ƃ����܂��B�I�y�����h�̏ꍇ�͒P�ɒl��Ԃ��܂��B�������Ė��[�܂Ōv�Z�������킽�邱�ƂɂȂ�܂��B
���̂悤�ȏ����́A�r�p�k�������s����ꍇ�ł����l�ł��傤�B
���������ꍇ�́AInterpreter���g���āA���ׂẴm�[�h�ɑ���getValue()���\�b�h����������̂��悢�ł��傤�B
interface Node { abstract int getValue(); } class PlusOperand implements Node { Node[] node; int getValue() { int value = 0; for (int i=0;i < node.length;i++) { value += node[i].getValue(); } return value; } } class Operand implements Node { int value; int getValue() { return value; } }
�Ȃ��AInterpreter�̓p�[�X�̂Ƃ��Ɏg����p�^�[���ł͂Ȃ��̂ŁA�e�L�X�g����\�������p�[�X��Ƃ͕ʓr�s���K�v������܂��B
�ȏ�A�������̃p�^�[������Ă��܂������A���ۂɓK�p�����ŕK�v�Ȓm���́A�|�����[�t�B�Y�����g���A�Ƃ����������ꂾ���̂��Ƃł��B������ւ��̑ΏۂɂȂ邩�́A���̏ɂ���Ĉ���Ă��܂��B
���̂ق��̃p�^�[���ł��|�����[�t�B�Y���ɂ���ւ�����b�ɂ��Ă���p�^�[���͑�������܂����A�����ɋ������̂͂��ꂪ�v�̂��̂ł��B
���̃p�^�[�����T�u�N���X�ɂ�鏈���̐�ւ��ł����A�������邩�ǂ������T�u�N���X���g�ɔ��f�����Ă���Ƃ���ƁA�����̃T�u�N���X�ɑ��ď��ɏ������˗����Ă���Ƃ��낪�A����܂ł̂��̂ƈقȂ��Ă��܂��B
��|�����[�t�B�b�N�ȏ�����������A�g�p����T�u�N���X�̐�ւ��͈ȉ��̂悤��if-else����switch�������g���čs���܂��B
Handler hdr; switch (cnt) { case 0: hdr = new AbcHandler(); case 2: hdr = new XyzHandler(); default: hdr = new DefHandler(); } hdr.handle();
�|�����[�t�B�Y���̕��@���炷��Aswitch���͔r���ł���͂��ł����A�ȑO�c�_�����Ƃ����A�ǂ����Œ��ڎw�肷�邩�Aif����switch���ŏ������肷��K�v������܂��B
Chain Of Responsibility�ł́A���̏���������T�u�N���X���ɂ����A��L��switch���Ŏ��グ�Ă���N���X�ɏ��ɓn���Ă����܂��B
class AbcHandler extends Handler { boolean handle(int cnt) { if (cnt != 0) { return false; } else { ... ���� ... return true; } } }
�����āA�����ł��Ȃ���Ύ��̃T�u�N���X�ɉĂ����܂��B�����čŏ��ɏ����ɍ��v�����N���X���������s���A���Ƃ̃N���X�ɂ͉�܂���B�����̗D�揇�ʂ����߂�A�����X�g�͌Ăяo�����Ŏw�肷��K�v������܂��B
��������ɑ��鏈�����P�P�Ō��܂��Ă���ꍇ�A���炢�ɂ��Ă��镪�A�Ăяo���̃I�[�o�[�w�b�h������܂��B
�ʃo���G�[�V�����Ƃ��āA�Ō�Ƀf�t�H���g�������Ă��ĕK�����炩�̏�����������p�^�[���⍇�v���镡���̏������ׂĂ̏������\�ɂ���p�^�[��������܂��B
Handler�̐e�N���X����ю��ۂ̏����̃T�u�N���X�͕ύX����K�v���Ȃ��A�ʂ̏������K�v�ɂȂ�T�u�N���X��lj�����悢�_�����̃p�^�[���̓����ł��B
����ɃJ�X�^�}�C�Y���āA�A�����X�g���O���t�@�C���ɋL�q���ēǂݍ��ނ悤�ɂ���A�Ăяo�������ύX���Ȃ��Ă悭�Ȃ�ł��傤�B
���j�[�N�ȕ��@�ł͂���܂����A���炢�ɂ��Ă��镪�̃I�[�o�[�w�b�h����A���܂�g���Ă��܂���BJava��Awt�̃N���X�ňȑO�g���Ă������炢�ł��B
���̒��ɂ͒���l�Ƃ������̂����܂��B�l����l�ɗv�����o���ۂɒ��ڏo�����ɒ���l����čs���̂ł��B����́A����l�����̕���ɂ��Ď������悭�������Ă��邩��ł���A�܂��ώG�ȃv���Z�X�����ɂ���Ă���邩��ł���A�܂������ɒ��ڎd�������Ă����l�Ƃ̃R�l�N�V�������Ȃ�����ł��B
�܂��A����l�́A�d���������ɂƂ��Ă��𗧂��̂ł��B���������ڗv���������ɁA��������v�����ĕK�v�Ȃ��Ƃ����������ɓ`���Ă����̂ŁA�����͎����̎d���ɐ�O�ł���̂ł��B
�N���X�\���ɂ��Ă��S���������Ƃ������܂��B�N���X�ƃN���X�̊Ԃɗ����āA������s���܂��B�Ăяo�����̃N���X�́A��A�̌��܂肫�����������������g�ł͍s�킸�ɁA���̃I�u�W�F�N�g�Ɉ˗����čs���܂��B�s�����������ڌĂяo�����ɊԂɂ��܂����Ƃ��|�C���g�ł��B�����Ŏ��グ�邢����̃p�^�[�����Ԃɓ����āA������s���܂��B
�������A����N���X������ǂ����Ƃ����̂́A���N���X�Ƃ̑��ΓI�ȊW�ɉ߂��܂���B�Ăяo�����̃N���X����A����̐�̃N���X�������Ȃ���A���̒���̃N���X����̓I�ȏ������s���Ă���悤�Ɍ����܂��B���ہA�����Ɍ���A�قƂ�ǂ̃N���X�͒�����s���Ă��邾���ł��B
�����̃N���X�́A����Manager�Ɩ��Â����邱�Ƃ�����܂��B
�C���X�^���X�����̂Ƃ���́AFactory�p�^�[���Ɠ����ł��B����Factory Method�ƈႢ�AFactory�N���X�͐����݂̂���Ɏ����A���g�ł͏�Ԃ������܂���B�ǂ�Ŏ��̔@���AFactory Method��new�������ɐ������\�b�h��lj����邱�Ƃł���AAbstract Factory�͒��ۓI�ȑ��݁i�����g�̎��̂������Ȃ��j���Ӗ����Ă��܂��B
���̂悤�Ȑ�������ɂ����ǂ郁�\�b�h������̂́A�����̃C���X�^���X�̑g�����邽�߂ł��B�P��̃N���X�̃C���X�^���X������Ȃ炻�̃N���X��create���\�b�h����邩�A���邢�͒P��new���s�����������ł��BFactory Method�̂悤�ɐ������\�b�h�������Ă��邱�Ƃ��d�v�Ȃ̂ł͂Ȃ��A��������C���X�^���X�̑g�������Ă��邱�Ƃ��|�C���g�Ȃ̂ł��B
�����Ă��̂悤��Factory�N���X������āA�ɉ����Đ��������C���X�^���X�̑g���ւ��܂��B
�܂��A�����Ɏ�Ԃ���������̂����ɐ������Ă�����̂�Abstract Factory�ł͂���܂���B����͎��ɏq�ׂ�Builder�p�^�[���ł��B
Abstract Factory�������ɃC���X�^���X������̂ɑ��ABuilder�͒i�K��ŃC���X�^���X�����グ�Ă����܂��B�Ƃ����Ă��Anew�͂P���ŁA���̑O��ɐ�������I�u�W�F�N�g�ɑ��āA���낢��ƕt�������Ă����܂��B
Builder�p�^�[���ł́ABuilder�����ł͂Ȃ��ADirector�N���X���ꏏ�ɓo�ꂵ�܂��B���ۂɃI�u�W�F�N�g������̂�Builder�ł����ADirector��Builder�̈�A�̃��\�b�h���Ăяo���āA�I�u�W�F�N�g�����Ă����܂��BBuilder�őg�ݗ��Ă���N���X�́ADirector�̌Ăԏ����ŃI�u�W�F�N�g���g�ݗ��Ă���悤�ɂ���K�v������܂��BBuilder�̓I�u�W�F�N�g�����E�ύX�̊�{�I�ȃ��\�b�h����ADirector���������g���đg�ݗ��Ă܂��B
�܂�ABuilder�p�^�[���́A�����菇���O�o���ɂ��邱�ƁA�R���X�g���N�^���O�o���ɂ���Ƃ������Ƃł��B�����ŁA���ށE�����̌������p�����Ă��܂��B�P�N���X�őS�����Ă��܂��̂ł͕��G������ꍇ�A�����菇�͕������Ă��܂��̂ł��B�������邱�ƂŁA�\�����V���v���ɂȂ�A�ė��p�������܂�܂��B
Builder�͍\���I�ȃI�u�W�F�N�g�̑g�ݗ��Ă����ł͂Ȃ��A�t�@�C���╡�G�ȕ�����̑g�ݗ��ĂɎg�p����邱�Ƃ�����܂��B
�N���X���Ƃ��āA����Maker�Ɩ��Â����邱�Ƃ�����܂��B
���̃p�^�[���́A
�P. ��������N���X�̌Ăяo�����X�ɍs���̂ł͂Ȃ��A����ɂP�̃N���X����\���āA�O���ɂP�̃C���^�[�t�F�[�X����܂��B
�Q�D�����̃N���X��g�ݍ��킹�čs����A�̏������A�����Ă܂Ƃ߂čs���܂��BAbstract Factory��Builder��������㗝����̂ɑ��āAFacade�͏�����㗝���܂��B
����́A��A�̃N���X�Q�i�����Ă�jar�Ńp�b�P�[�W�������j�ւ̃A�N�Z�X����ɂ���ꍇ�Ȃǂɗp�����܂��B��������ɂ��邱�Ƃɂ��A�N�Z�X��e�Ղɂ��܂��B
����́A�p�^�[���Ƃ����p�^�[���ł����A������x�̋K�͂ɂȂ����ł��g�����̂ł��B������A����Manager�Ɩ��Â���ꂽ�肵�܂��B
�܂��A�t���[�����[�N�ŗp������R���g���[���[���A�N���C�A���g���猩��Α����ɂȂ邽�߁AFacade�Ƃ����Ă悢�ł��傤�B
���̃p�^�[���́A��̃I�u�W�F�N�g���瑼�̃I�u�W�F�N�g�ւ̃��b�Z�[�W�𒇉�܂��B�ʒm���鑤�Ƃ���鑤�ɂ킩��Ă���̂ł͂Ȃ��AMediator������I�u�W�F�N�g�Q�̊Ԃōs����ʐM�𒇉��̂ł��B
Observer�p�^�[���ł́AObserver���̂����������̂ɑ��āAMediator�̓��b�Z�[�W�ʐM�̒�����s�������ł��BObserver�p�^�[���ł́A��̃I�u�W�F�N�g�̕ω����̃I�u�W�F�N�g�ɒʒm����̂ɑ��AMediator�p�^�[���ł͕����̃I�u�W�F�N�g�̕ω����P�̃I�u�W�F�N�g�ւ�������W��āA�K�X���̃I�u�W�F�N�g�ɒʒm����܂��B
Facade���A�Ăяo�����̃C���^�[�t�F�[�X�ł����t�W�ł���̂ɑ��AMediator�͗����ŏ����W�Ďw�����o���������ł��B
�ΏۂƂȂ�I�u�W�F�N�g�ɒ��ڃA�N�Z�X�����Ȃ��ŁAWrapper�ŕ�ݍ���ŁAWrapper�o�R�ŃA�N�Z�X������p�^�[���ł��B����̈��ł����A�P�I�u�W�F�N�g���ݍ���ł��邽�ߕʃJ�e�S���[�ɂ��܂����B
����́A���̃I�u�W�F�N�g�ɑ���A�N�Z�X�𐧌�����ꍇ��A�@�\��t����������A���邢�͒��ڃA�N�Z�X�ł��Ȃ����߂ɊԂɓ����čs���ꍇ������܂��B
���O�̂Ƃ���A��̃I�u�W�F�N�g�Ԃ̒ʐM�̊Ԃɓ����āA�C���^�[�t�F�[�X�����킹��p�^�[���ł��B
�K�p���@�Ƃ��Ĉȉ��̂R������܂��B
1. �C���^�[�t�F�[�X�ϊ�
�Ⴆ�A���ۂɎg�p����N���X�̃��\�b�h��getAdp()�ŁA�Ăяo�����ł�getA()�Ƃ��ČĂяo���Ȃ���Ȃ�Ȃ��ꍇ�AAdapter���Ԃɓ����āAgetA()�ŎāAgetAdp()���Ăяo���Ă����܂��B
2. �C���^�[�t�F�[�X�⊮
�e�N���X�������̓C���^�[�t�F�[�X���p������ꍇ�A���̑S���ۃ��\�b�h���������Ȃ���Ȃ�܂���B���̂Ƃ��A�e�q�W�̊Ԃɓ����đS���ۃ��\�b�h�̃f�t�H���g���\�b�h���������A���̃N���X�ł͕K�v�ȃ��\�b�h����������������悤�ɂ��܂��BJava�̃C�x���g�W�̃N���X�ŁAListener��implement���ċ�̃��\�b�h����������Adapter�N���X������ɊY�����܂��B
3. protected���\�b�h���g�p�\�ɂ���B
�ΏۃI�u�W�F�N�g��public���\�b�h���Ȃ����߂ɁA�ΏۃI�u�W�F�N�g���p�����ăT�u�N���X����A�N�Z�X���āApublic���\�b�h����܂��B
public class A { protected void exec() { ... ���� ... } } public class B extends A { public void execA() { super.exec(); } }
�Ԃɋ���ŁAProxy�T�[�o���l�A�ΏۃI�u�W�F�N�g�̌Ăяo���̃^�C�~���O��ς�����A�L���b�V����Ԃ����肵�āA�ΏۃI�u�W�F�N�g�̑���̏����������肵�܂��B�Ăяo������Proxy�ł��邱�Ƃ��ӎ����܂���B
���̃p�^�[���͊����̃N���X�ɋ@�\��lj�����p�^�[���ł��B�����́A�Ϗ��ƌp�����g���Ă���_�ŁAWrap����I�u�W�F�N�g�������o�[�Ɏ����A�����̃I�u�W�F�N�g�Ɠ����C���^�[�t�F�[�X���������Ă��܂��B
�O������͓������\�b�h�ŃA�N�Z�X����A���g�̊g�����������āAWrap�����I�u�W�F�N�g���Ăяo���܂��BWrap�ΏۃI�u�W�F�N�g�́A�����C���^�[�t�F�[�X���������Ă�����̂ł���Ή��ł��\���܂���B�܂����̃I�u�W�F�N�g���g�������C���^�[�t�F�[�X���������Ă��邽�߂ɁADecorate�����ΏۂɂȂ�܂��B
��j�wJava����Ŋw�ԃf�U�C���p�^�[������x���
public abstract class Border extends Display { protected Display display; protected Border(Display display) { this.display = display; } public String getRowText(int row) { return borderChar + display.getRowText(row) + borderChar; } }
�����̃N���X�̊g���ɂ́A�p���ƈϏ����g���܂��B
�E�p���I�u�W�F�N�g�w���̑�����g���܂��B�������e�N���X�̃��\�b�h���g���ꍇ�A������̐e�N���X�̃��\�b�h�����g���܂���B
�E�Ϗ��N���X���p�������A���̃N���X�̎Q�Ƃ������o�[�ɕێ����Ă����āA�K�v������A���̃N���X�̃��\�b�h���Ăяo���܂��B�e�N���X��C���^�[�t�F�[�X�������o�[�Ɏ������ꍇ�A�|�����[�t�B�Y���ɂ���ē��I�ɌĂяo����郁�\�b�h���ς��܂��i�p���̏ꍇ�́A�ÓI�ŁA���s�ł��郁�\�b�h�͈��̃N���X�ɌŒ肳��Ă��܂��j�B���������̃N���X�̃��\�b�h��protected�̏ꍇ�́A�p���łȂ��Ǝg���܂���B�܂��p���̏ꍇ�e�N���X�̃��\�b�h�̋L�q�͕s�v�ł����A�Ϗ��ł͓����V�O�l�`���[�̃��\�b�h�������A�Ϗ�����I�u�W�F�N�g�̃��\�b�h���Ăяo���K�v������܂��B
Java�ł͑��d�p�����g���Ȃ��̂ŁA�Ϗ���p����A�����̃N���X�̋@�\�������Ƃ��ł��܂��B���̂��ߍŋ߂̃I�u�W�F�N�g�w���v���O���~���O�ł͌p�������Ϗ����E�߂��Ă��܂��B�N���X�̑��d�p���͂ł��܂��A�C���^�[�t�F�[�X�̑��d�p���Ȃ�ł��܂��B
�p���������闝�R�́A�����I�Ȑ�������A�\���̗����̂��₷���̖��ɋN�����Ă��܂��B����N���X�̃��\�b�h���������g����������Ƃ������R�Ōp������ƁA�Ӗ��I�ɂ܂������ʂ̌n���}���ł��Ă��܂����ƂɂȂ�܂��B�����������ƂŁA�ʂ̃N���X�̃��\�b�h���g����������Ƃ����Ă����d�p���͂ł��Ȃ��̂Ōp���͂ł��Ȃ��Ȃ�܂��B�ނ��낻�̃N���X�̕����Ӗ��I�ɂ͎q�ǂ��ł������Ƃ��Ă��ł��B����̓N���X�v�}�������Ƃ��ɔ��ɂ킩��Â炢���̂ɂȂ�܂��B�Ȃ̂ňӖ��I�ɓ��n���Ŋg�����Ă���Ƃ����̂ł͂Ȃ�����A�p���͂��Ȃ����������̂ł��B
���鎞�_�E�����Ԃ̃C���X�^���X��ۑ����Ă������߂ɁA�ۑ���p�̃I�u�W�F�N�g��p�ӂ���p�^�[���ł��B�ۑ�����̂́A�ΏۂƂȂ�C���X�^���X�̒�����K�v�Ȉꕔ�̒l�����ō\���܂���B�������邱�ƂŁA�C���X�^���X�̗�����ۑ����A�K�v�ł���Ό��̏�Ԃɖ߂����Ƃ��ł��܂��B
���ɋZ�I�I�Ȃ��͉̂�������܂��A�K�p����Ƃ��ɏd�v�Ȃ̂͂����̃C���X�^���X��ۑ�����ہA������̎Q�Ƃ��Ȃ��悤�ɂ��邱�Ƃł��B�łȂ��ƁA�ۑ������I�u�W�F�N�g������ɏ����������Ă��܂��\��������܂��B�N���[��������ĕۑ�����Ƃ����̂�������������܂���B
�����ɕ��ނ����p�^�[���́A���������邱�Ƃł��B�f�[�^��ێ�����N���X�ƁA���̃f�[�^�ւ̑�������܂��B
�{���A�I�u�W�F�N�g�w���ł́A���̃I�u�W�F�N�g�Ɋւ��鏈���́A�I�u�W�F�N�g���̂������Ă���i���J�v�Z�����j�͂��ł����A����ł̓I�u�W�F�N�g����剻���Ă��܂��̂ŁA�֘A���鏈�����O�ɏo���܂��B
���ہA�I�u�W�F�N�g�ɊW���鏈���A���ׂē����I�u�W�F�N�g�����ɍ��͕̂s�K�ȏꍇ������܂��B�����̃I�u�W�F�N�g�Ԃŗގ���������������ꍇ�A���ꂼ��̃I�u�W�F�N�g���ɏ��������������A�ʂ̃I�u�W�F�N�g�Ɏ������������ėp���������Ă����̂ł��B�����ƃf�[�^����̉����Ă���ꍇ�́A���̃I�u�W�F�N�g�ɂ����g���Ȃ����߁A�ėp��������܂���B�ǂ̋@�\���O�o���ɂ��邩�͓�����ŁA�͈�ł͂���܂���B
�܂��f�[�^�ւ̑����ʃN���X�ɂ���ƁA���삷��I�u�W�F�N�g�ɓ����̃f�[�^�\�������J����K�v���o�Ă��āA�J�v�Z�����̌������j���Ă��܂��\��������܂��i�Ƃ����Ă��Apublic�����g���Ă��Ȃ���Ί֘A�̂Ȃ����̃I�u�W�F�N�g�ɑ��Ă��������Ƃł����j�B
���ہA�A�v���P�[�V�����̒��ŁA�e�I�u�W�F�N�g�̓J�v�Z�����ŒP�̂œƗ����Ă���̂ł͂Ȃ��A�ʏ핡���̃I�u�W�F�N�g���֘A���Ĉ�̋@�\����Ă��܂��B����ɍו��ɕ�������ƈ�̃I�u�W�F�N�g���Ɨ����Ĉ�̋@�\����Ă��܂��B���������Ăǂ��܂ł����Ă��Ăǂ��܂ł��J���Ă��邩�ӎ����Ȃ���Ȃ�Ȃ��ł��傤�B
�����āA���̈�̋@�\����Ă���I�u�W�F�N�g���W�܂��āA���̃I�u�W�F�N�g�ɑ��Ĉ�A�̋@�\����܂��B�����̃N���X��jar�t�@�C���Ƃ��Ĉ�ɂ܂Ƃ߂���ꍇ�������̂ł��B����ɁA�����jar�t�@�C����g�ݍ��킹�āA��̃V�X�e������邱�ƂɂȂ�܂��B
����́A�����o�[�ϐ��ւ̃A�N�Z�X���A�O���N���X�Ɉϑ�����p�^�[���ł��B
���̏ꍇ�A�����o�[�ϐ��͏W���\���������Ă��āA���̏W���̗v�f�ւ̃A�N�Z�X��Iterator��p���ď����A�N�Z�X�����܂��B
�����_���A�N�Z�X�̏ꍇ�́A�T�C�Y��Ԃ����\�b�h��w��ʒu�̃��\�b�h���K�v�ɂȂ�܂����A����͂��̃N���X���̂������Ă���悢�̂ł��B�������A�����A�N�Z�X�̏ꍇ�́A���݂̃J�[�\���ʒu��ێ�����K�v������̂ŊO���N���X�Ɏ�������̂��悢�̂ł��B���ꂪIterator�p�^�[���ł��B����Iterator��_����ɂ́A�W���N���X�ɑ���A�����A�N�Z�X�ƃ����_���A�N�Z�X�Ƃ������_���K�v�ł��B�܂�Iterator�́A�S�̂̃T�C�Y���c���ł��Ȃ��X�g���[����A�ꊇ�Ńf�[�^��Ԃ��Ă���̂ł͂Ȃ������Ԃ��Ă���f�[�^�ɑ��ėL���ł��B
����I�u�W�F�N�g�̏�Ԃ��ω������Ƃ��ɁA���̕ω��ɉ����������𑼂̃I�u�W�F�N�g�ɈϔC���܂��B��Ԃ̕ω���ʒm�Ώۂ́A�����o�^�\�ł��B�ʒm����Observer�N���X�́A���̃I�u�W�F�N�g�̏�Ԃɉ����ď������s���܂��B
�������āA�I�u�W�F�N�g�ƁA���̃I�u�W�F�N�g�ɊW���鏈��������̂ł��B
�ʖ��FListener�AHandler
����́A����I�u�W�F�N�g�ɑ��鏈����ʂ̃I�u�W�F�N�g�Ɉς˂�p�^�[���ł��B���̍ہA����̃I�u�W�F�N�g�ɁAthis�L�[���[�h���g���āA�������g�����ׂĈ����n���Ă��܂��܂��B�����āA����̃I�u�W�F�N�g�́A�����̃��\�b�h���Ăяo���ď������s���܂��B����́A�f�[�^�\�������I�u�W�F�N�g�Ƃ��̏���������I�u�W�F�N�g�Ƃ����邱�Ƃ�ړI�Ƃ��Ă��܂��B�������邱�ƂŃf�[�^�\�������I�u�W�F�N�g���V���v���ɕۂ��A���̃f�[�^�\���ɑ��鏈�����O�o���ɂ��āA������lj����₷������̂ł��B
��̓I�ɂ́A����I�u�W�F�N�g��accept()���\�b�h��Visitor��n���A����accept()�̒���Visitor��visit()���ĂԂ��ƁiVisitor�������A�K�₳����j�ŏ�������܂��B
���ۂ̏����́Avisit()�ɏ�����Ă��邽�߁A�ʂ�accpet���\�b�h����ĂȂ��Ă��Avisit()���\�b�h�̈����ɂ��̃I�u�W�F�N�g��n���ςނ��Ƃł��B����accept()���\�b�h�̂Ȃ��p�^�[���́A�ʂ�Visitor�p�^�[���łȂ��Ă��p�ɂɗp�����邱�Ƃł��B�Ƃ����̂́A���郁�\�b�h�̈����ɃI�u�W�F�N�g��n���A���̃��\�b�h���I�u�W�F�N�g�ɑ��Ă��낢��ȑ��������Ƃ����̂͂悭���邱�Ƃ�����ł��B
�������AVisitor�p�^�[���ł́A�ΏۃI�u�W�F�N�g����AVisitor���Ăяo���܂��B���̃I�u�W�F�N�g�̈�A�̏����̒��ɁA�ʂ̏�����lj��������ꍇ�Ɏg���̂ł��B
Visitor�́A�ΏۃI�u�W�F�N�g����̓I�ɒm���Ă��Ă��m��Ȃ��Ă��\���܂���B���̗�̂悤�ɁA�����C���^�[�t�F�[�X���������Ă���A�N���X�Q���������ۂɁA�����ɋ��ʂƂȂ�visit()���\�b�h�����s���Ă������ł����A��̓I�ȃI�u�W�F�N�g�ɉ�����visit()���\�b�h���������Ă������ł��B
�܂��AComposite�p�^�[���Ƌ��ɗp������ꍇ��Visitor�͋�̓I�ȃI�u�W�F�N�g�̂��Ƃ�m���Ă��āA���ꂼ��ɉ�����visit()���\�b�h���������܂��B�܂�����visit()���\�b�h�͑ΏۃI�u�W�F�N�g����ĂԕK�v������܂��BVisitor�ɂ����āA�V���Ɏ��o�����m�[�h�ɑ��ď������s���ہAif���ŕ������ɁA�|�����[�t�B�Y�����g���đΏۃI�u�W�F�N�g��accept()���\�b�h�����s���Ĕ��肳����̂ł��B�����Ėʔ������Ƃɂǂ̃m�[�h��accept()���\�b�h������visitor.visit(this);���������Ă���̂ł��B�������ł���Ȃ���Ă�郁�\�b�h�͈Ⴂ�܂��B����̓I�[�o�[���C�h�ł͂Ȃ��I�[�o�[���[�h�i���\�b�h�̃V�O�l�`���̈Ⴂ�j�ł��B
�������Ĉꌩ��ȃI�u�W�F�N�g�Ԃ̍s���������܂�܂��B����͍ċA�\���ɑ��ēK�p�������߂ɂ����Ȃ�̂ł����Ēʏ�͈��s����������܂��B
Composite�����Visitor��accept()���\�b�h����Ȃ��̔�r�i�wJava����Ŋw�ԃf�U�C���p�^�[������x���ꕔ���p�j
Composite�p�^�[���̂ݏꍇ�@�\�\Visitor�Ȃ���Entry���g���������s�� public class File extends Entry { // ... ���� ... protected void printList(String prefix) { System.out.println(prefix + "/" + this); } } public class Directory extends Entry { // ... ���� ... protected void printList(String prefix) { System.out.println(prefix + "/" + this); Iterator it = directory.iterator(); while (it.hasNext()) { Entry entry = (Entry)it.next(); entry.printList(prefix + "/" + name); //�|�����[�t�B�Y�� } } } public class Main { public static void main(String[] args) { Directory rootdir = new Directory("root"); // ... ���� ... rootdir.printList(); } }
accept()�Ȃ��̏ꍇ�@�\�\Visitor��Entry�̏������s�� public class ListVisitor extends Visitor { private String currentdir = ""; public void visit(File file) { System.out.println(currentdir + "/" + file); } public void visit(Directory directory) { System.out.println(currentdir + "/" + directory); String savedir = currentdir; currentdir = currentdir + "/" + directory.getName(); Iterator it = directory.iterator(); while (it.hasNext()) { Entry entry = (Entry)it.next(); if (entry instanceof File) { //��|�����[�t�B�Y�� visit((File)entry); } else if (entry instanceof Directory) { visit((Directory)entry); } } currentdir = savedir; } } public class Main { public static void main(String[] args) { Directory rootdir = new Directory("root"); // ... ���� ... ListVisitor lv = new ListVisitor(); lv.visit(rootdir); } }
accept()����̏ꍇ�\�\Entry��Visitor��K�₳���� public class ListVisitor extends Visitor { private String currentdir = ""; public void visit(File file) { System.out.println(currentdir + "/" + file); } public void visit(Directory directory) { System.out.println(currentdir + "/" + directory); String savedir = currentdir; currentdir = currentdir + "/" + directory.getName(); Iterator it = directory.iterator(); while (it.hasNext()) { Entry entry = (Entry)it.next(); entry.accept(this); // �|�����[�t�B�Y�� } currentdir = savedir; } } public class Directory extends Entry { // ... ���� ... public void accept(Visitor v) { v.visit(this); } } public class Main { public static void main(String[] args) { Directory rootdir = new Directory("root"); // ... ���� ... rootdir.accept(new ListVisitor()); } }
�܂�����Visitor�p�^�[���ł̓_�u���f�B�X�p�b�`���p�����Ă��܂��B
http://java-house.jp/ml/archive/j-h-b/014912.html�Q��
�����Aobj1, obj2, arg1, arg2 �ŏ�������郁�\�b�h�i��̃I�u�W�F�N�g������ł����i�K�ŌĂ�郁�\�b�h�����肳���j��
1. obj1.do(obj2, arg1, arg2)
2. obj2.do(obj1, arg1, arg2)
�̂ǂ���Ŏ������邩�Ƃ����̂́A�����ΔY�܂������ł��B(obj1, obj2).do(arg1, arg2)�̂悤�ȃ_�u���f�B�X�p�b�`�́Ajava�ł͎g���Ȃ��̂ŁAVisitor�p�^�[���̂悤�ɂȂ�܂��B
�܂��ȉ��̃y�[�W��Visitor�p�^�[���ɂ��āA��̓I�ȃ\�[�X�������Đ[���˂�����ł��܂��̂ŎQ�Ƃ��������Baccept()���\�b�h�Ȃ��Ŕ�|�����t�B�b�N��instanceof���g��Ȃ��������f�ڂ���Ă��܂��B
http://www.ncfreak.com/asato/doc/patterns/visitor.html��x�쐬�����C���X�^���X���g���܂킷�p�^�[���ł��B
����́A�P�̃C���X�^���X���g���܂킷�p�^�[���ł��B����̓C���X�^���X�����������Ă͍���ꍇ�A���邢�͈�Ŏ������ꍇ�Ɏg���܂��B�����̃C���X�^���X�����̂̓������Ǝ��Ԃ̖��ʌ����ł��B
�ʂ�Singleton���g��Ȃ��Ă��Aprivate��static�ȃN���X�ϐ��ō\�����ꂽ�N���X���g���P�ł��邱�Ƃ��ۏ���܂����Astatic���g���̂̓I�u�W�F�N�g�w���I�ł͂Ȃ��̂ŁASingleton���g���܂��Bstatic�ɂ����ꍇ��Singleton�̑Δ�ɂ��Ĉȉ��̃y�[�W���Q�l�ɂȂ�܂�
http://www.freeml.com/message/[email protected]/0001069
�ʂ̃o���G�[�V�����Ƃ��āA�C���X�^���X�̐������肵�Ďg���܂킷�p�^�[��������܂��B����̓R�l�N�V�����v�[�����O�ȂǂɎg���܂��B�C���X�^���X�̃v�[���ɂ́A�z���Stack���p�����܂��B
��ʂɏЉ��Ă���Singleton�ɂ͎��͖�肪����A�����ɕʃX���b�h����擾���\�b�h�ɃA�N�Z�X�����ꍇ�A�C���X�^���X�������邱�ƂɂȂ�܂��B�����h�����߂ɁAsynchronized���w�肵�Ĕr����������ăC���X�^���X��������ɂȂ�悤�ɕۏ��܂��B�Ƃ��낪��������Ɣr������̂��ߐ��\�ɉe�����o�܂��B�����ōl���o���ꂽ�̂�double-checked locking�p�^�[���ł��B����͓������K�v�ȉӏ������肵�āA��x�C���X�^���X�̑��݂��`�F�b�N���邱�Ƃ��疼�Â����܂����B����������ɂ��Ă���肪���邱�Ƃ��w�E����Ă��܂��B
dW Java technology double-checked locking��Singleton�p�^�[��
�����Ȃ��static�t�B�[���h���悢�Ƃ������_�ɂȂ��Ă��܂��悤�ł��B
����́A�����̎�ނ̃C���X�^���X���g���܂킷�p�^�[���ł��B�����Singleton�ƈႢ�A������ނ̃C���X�^���X���������邪�A���ꂼ�ꂪ�g���������ꍇ�Ɏg���܂��B
���͂悭���̃p�^�[�����A�f�[�^�x�[�X������������Ă����}�X�^�[�f�[�^���L���b�V������ꍇ�Ɏg���܂��B���ID�Ȃǂ��L�[�ɂ��āA��Ə����i�[�����I�u�W�F�N�g��Map�ɃL���b�V�����āA�g���܂킷�A�v���[�`�����܂��B
�C���X�^���X�̃R�s�[���쐬����p�^�[���ł��B�g���܂킷�p�^�[���ł͂Ȃ��A�R�s�[��n���p�^�[���Ȃ̂Ń������͐ߖ�ł��܂��A�����̃R�X�g��ߖ�ł��܂��BFlyWeight���I�u�W�F�N�g�����L���邱�Ƃ�ړI�Ƃ��ē����C���X�^���X�ւ̎Q�Ƃ�Ԃ��̂ɑ��āAPrototype�ł̓R�s�[��n���܂��B
�\���I�ɂ́Ajava�ł�clone()�Ƃ������\�b�h�����łɂ���̂ŁA�ʒi���������̂ł͂���܂��Adeep�R�s�[��shallow�R�s�[�̈Ⴂ�ɂ͋C���������������ł��傤�B
�܂�����Prototype�p�^�[���̔w�i�ɂ���̂́A����̃N���X�Q����邤���ŁA�p���𗘗p���ĕ����̃T�u�N���X�����̂��A����Ƃ��N���X�͈�ɂ��ă����o�[�̒l�ɂ���ē������̂��Ƃ�����肪����܂��B��҂̏ꍇ�́A��|�����t�B�b�N�ȃN���X�v�ɂȂ�܂��B
�T�u�N���X�ɂ���ĕ�����ꍇ abstract class Animal { abstract int getLeg(); } class Kame extends Animal { int getLeg() { return 4; } } class Tsuru extends Animal { int getLeg() { return 2; } }
�C���X�^���X�ɂ���ĕ�����ꍇ class Animal { String type; Animal(String type) { this.type = type; } int getLeg() { if (type.equals("Kame")) { return 4; } else if (type.equals("Tsuru")) { return 2; } } }
��K�͂ȃv���W�F�N�g�ł́A�t���[�����[�N�����`�[���ƃt���[�����[�N�ɉ����Ď������Ă����`�[���Ƃ̓�ɕ�����܂��B�ǂ���ɑ����邩�ŁA�I�u�W�F�N�g�w����g�ɂ����邩�ǂ��������܂�܂��BJava���g���Ă���A�I�u�W�F�N�g�w��������Ă���Ƃ����킯�ł͂���܂���B
�t���[�����[�N�ɉ����Ď�������`�[���ɉ�������ꍇ�A�f�U�C���p�^�[����K�p����ǂ��납�A����ɃN���X�����̂��狖����܂���B�傫�ȃv���W�F�N�g�ł́A�X�l���������Ă��Ȃ��̂��������A�S�̂̃X�^�C�������ꂳ��Ă��邱�Ƃ��d�v������ł��B
�t���[�����[�N�̓K�p�ɂ̓����b�g������f�����b�g������܂��B�X�^�C�������ꂳ��A�y�ɑg�߂�悤�ɂȂ����Ƃ��������b�g�̔��ʁA������Ƃ��������ł��t���[�����[�N�ɂ��������đ�ʂɖ��ʂȃR�[�h�������Ȃ���Ȃ�Ȃ�������A�t���[�����[�N���ł͕s�\�ȏ����������Ė�����荇�킹�邽�߂ɉ�肭�ǂ������������Ȃ���Ȃ�Ȃ�������Ƃ��������Ƃ�����܂��B�t���[�����[�N���͔̂��ɃI�u�W�F�N�g�w���I�Ȃ̂ɁA�����Ɏ�������Ă���R�[�h�͑S���葱���^�ł���Ƃ�����Ȃ��Ƃ��N���܂��B
��������͋Ɩ��A�v���P�[�V�����̏ꍇ�ŁA����n��c�[����P�̃A�v���P�[�V�������쐬����ꍇ�́A�f�U�C���p�^�[�������ɗ��ł��傤�B
�ŏ��̃J�e�S���[�ŁA�|�����[�t�B�Y�����g�����T�u�N���X�̐�ւ��̃p�^�[���́A���ۃt���[�����[�N�ŗp��������̂ł��B�|�����[�t�B�Y���̓C���^�[�t�F�[�X�ꂵ�ċK�i�𐮂��邽�߂Ɏg�p������̂Ȃ̂ŁA�v���W�F�N�g�̒��ŌX�̃v���O���}�[������ɃC���^�[�t�F�[�X������Ă��悤�Ȃ��̂ł͂Ȃ��̂ł��B���Ŗ�L�Ǝg���Ɠǂ݂ɂ������̂��o���オ��܂��B
�܂��ADecorator��ChainOfResponsibility�Ȃǂ̃g���b�L�[�Ȃ��̂����ێg�����Ƃ͂܂�ł��B��������Ǝc��́A�R�[�f�B���O���Ă���Ύ��R�Ɏg�����̂��炢�ɂȂ��Ă��܂��܂��B�����Ƀf�U�C���p�^�[����K�p���悤�Ƃ���̂ł͂Ȃ��A�œK�ȃN���X�\������邱�Ƃ�����Ǝv���܂��B