по сути набор предопределенных алгоритмов с общим интерфейсом
В мире программирования слишком многие вещи можно так охарактеризовать. Поэтому вообще не стоит использовать этот критерий для оценки схожести паттернов. Различие между всеми паттернами заключается в их назначении, то есть в том какую задачу тот или иной паттерн решает и какую зону ответственности он имеет.
Возьмем для примера билдер:
class Builder {
protected $obj;
public function create(){
$this->obj = new HtmlDocument();
}
public function addHeader(){
// добавляем хедер в $this->obj
}
public function addFooter(){
// добавляем футер в $this->obj
}
public function getObj(){
return $this->obj;
}
}
Какое назначение билдера? Создание сложного объекта и предоставление интерфейса для его конфигурации. При этом информацией о том как будет в конкретной ситуации будет сконфигурирован объект билдер не обладает - это задача классов использующих его.
А теперь давайте возьмем стратегию:
interface CalculateDiscountInterface {
public function execute($price);
}
class ClientCalculateDiscount implements CalculateDiscountInterface {
public function execute($price){
// рассчитываем цену по одному алгоритму
}
}
class ParterCalculateDiscount implements CalculateDiscountInterface {
public function execute($price){
// рассчитываем цену по другому алгоритму
}
}
Какое назначение стратегии? Реализация одной и той же функциональности по разным алгоритмам, с возможностью замены друг другом.