In a very small design you probably don't need any of them, but:
- a buffer will add drive to a signal. You'd use one when you are driving a lot of loads, or a long distance, or both, and your signal is unidirectional, like an address bus or the clock. You might use a buffer to delay a signal but that's not robust and needs care.
- a tristate buffer acts as a buffer and can also not drive the output (that is, let the output be driven by something else.) This is good for time-sharing a bus, for example the CPU needs to drive the addresses of a RAM chip, and so does the video chip. (But not both at the same time.) Both drivers can use a tristate buffer to drive a shared bus.
- a transceiver acts as a bidirectional buffer: it drives in one direction or the other, depending on a control input. That's useful for a long distance or highly loaded data bus, where the CPU might need to read or write data to the RAM
- a latch has a clock input and can hold a value. One use is to hold the top 8 bits of the address value in a 65816 system, where the databus drives this value for just the first half of a clock cycle, and then reverts to normal bidirectional data mode for the second half.
For a simple design, see
http://searle.hostei.com/grant/6502/Simple6502.htmlThe later CMOS versions of the 6502 have pretty high drive, and we rarely build multi-board RAM systems these days, so buffering of signals is done less than it used to be.