工厂模式概念
工厂模式是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。
3中不同的工厂模式
1.简单工厂模式(静态工厂模式):通过静态方法来创建对象
2.工厂模式:定义一个对象接口,让子类来决定具体的对象实例化
3.抽象工厂模式:使用对象组合来,对象的创建被实现在工厂接口所暴露的出来的方法
代码实例
/**
* 简单工厂模式:通过静态方法来实现对象创建
* Interface Drink
*/
interface Drink{
public function buy();
}
class Coffee implements Drink {
public function buy(){
echo "i want to coffee";
}
}
class Cola implements Drink{
public function buy()
{
echo "i want to cola";
}
}
class DrinkStore{
public static function orderCoffee(){
return new Coffee();
}
public static function orderCola(){
return new Cola();
}
}
$man = DrinkStore::orderCoffee();
$man->buy();//结果输出 i want to coffee
echo "<br/>";
$woman = DrinkStore::orderCola();
$woman->buy();//结果输出 i want to cola
/**
* 工厂模式:通过定义一个对象的接口,让子类来实现对象创建
* Interface Drink
*/
interface Drink{
public function buy();
}
class Coffee implements Drink {
public function buy(){
echo "i want to coffee";
}
}
class Cola implements Drink{
public function buy()
{
echo "i want to cola";
}
}
interface CreateDrink{
public function create();
}
class CoffeeFactory implements CreateDrink{
public function create()
{
return new Coffee();
}
}
class ColaFactory implements CreateDrink{
public function create()
{
return new Cola();
}
}
$coffee_factory = new CoffeeFactory();
$man = $coffee_factory->create();
$man->buy();//结果输出 i want to coffee
echo "<br/>";
$cola_factory = new ColaFactory();
$woman = $cola_factory->create();
$woman->buy();//结果输出 i want to cola
/**
* 抽象工厂模式:提供一个创建一系列的相关的或者相互依赖的对象接口
* 注意:这里和工厂方法的区别是:一系列,而工厂方法则是一个
* Interface Drink
*/
interface Drink{
public function buy();
}
class CoffeeHot implements Drink {
public function buy(){
echo "i want to hot coffee";
}
}
class CoffeeCold implements Drink {
public function buy(){
echo "i want to cold coffee";
}
}
class ColaHot implements Drink{
public function buy()
{
echo "i want to hot cola";
}
}
class ColaCold implements Drink{
public function buy()
{
echo "i want to cold cola";
}
}
interface SuperFactory{
public function createHot();
public function createCold();
}
class CoffeeFactory implements SuperFactory {
public function createHot()
{
return new CoffeeHot();
}
public function createCold()
{
return new CoffeeCold();
}
}
class ColaFactory implements SuperFactory{
public function createCold()
{
return new ColaCold();
}
public function createHot()
{
return new ColaHot();
}
}
$coffee_factory = new CoffeeFactory();
$man = $coffee_factory->createHot();
$man->buy();
设计原则
1.多用组合,少用继承
2.针对接口编程,不针对实现编程
3.为交互对象之间的松耦合设计而努力
4.类应该对扩展开发,对修改关闭
5.依赖抽象,不要依赖具体类
要点
1.所有工厂都是用来封装对象的创建
2.简单工厂,虽然不是真正的设计模式,但仍不失为一种简单的方法,可以将客户程序从具体的类中解耦
3.工厂方法使用继承,把对象的创建委托给子类,子类实现工厂方法来创建对象
4.抽象工厂使用对象组合,对象的创建被是现在工厂接口所暴露出来的地方中
5.所用工厂模式都在通过减少应用程序具体类之间的依赖所促进松耦合
6.工厂方法允许类将实例化延迟到子类中
7.抽象工厂创建相关的对象家族,而不需要依赖他们的具体类