前言:为什么要使用设计模式?
设计模式并不是生来就有的,也是前人大量编码,最后总结出来的一套代码结构设计经验,根本目的也是为了增加代码的复用性和可维护性。
顺便说一下设计模式很看重一个原则->开闭原则,会在下面的示例中得到体现!简单的来说就是说对扩展开放,对修改关闭。
工厂模式
工厂模式是一种实例化对象的模式,是用工厂方法代替new操作的一种方式
工厂模式根据抽象的程度,可以分为简单工厂模式,工厂方法模式,抽象工厂模式。
Ps:对于一些功能相似的类,我们通常会提供一个抽象接口,把公共方法暴露出来,供调用者实现具体的逻辑。
示例讲解
以保险为例
1.简单工厂模式
由一个工厂类根据传入的参数决定创建哪一种产品的类,其实属于一种比较自然的再封装,我们通常也会在代码设计中不经意的使用
interface Create_product { public function getProducts(); } //xyz的产品类 class Product implements Create_product { public fucntion getProducts() { //todo get products by api echo 'get products successfully'; } } //anlian的产品类 class Product implements Creat_product { public fucntion getProducts() { //todo get products by api echo 'get products successfully'; } } class Simple_facrtory { public static function createProduct($supp_name) { if ($supp_name=='Xyz') { return new Xyz\Product; } if ($supp_name=='Anlian') { return new Anlian\Product; } } } $product = Simple_factory::createProduct('Xyz'); $product->getProducts();
优点:客户端免除了具体产品对象的创建,统一使用工厂去创建对象
缺点:违背了开闭原则,当需要有新的产品的时候,会在工厂类的基础上修改,很容易引发错误。
2.工厂方法模式
对简单工厂模式进行了抽象,有一个简单抽象工厂类负责制定以下规范,一般在这种模式中,工厂类会与某个具体的产品类一一对应。
//抽象产品类的方法 interface Create_product { public function getProducts(); } //xyz的产品类 class Product implements Create_product { public fucntion getProducts() { //todo get products by api echo 'get products successfully'; } } //anlian的产品类 class Product implements Creat_product { public fucntion getProducts() { //todo get products by api echo 'get products successfully'; } } //将对象的创建抽象成一个接口 interface Create{ public function product(); } class FactoryXyz implements Create{ public function product() { return new Xyz\Product; } } class FactoryAnlian implements Create{ public function product() { return new Anlian\Product } } $factory = new FactoryAnlian(); $product = $factory->product();
优点:实现了开闭原则,对于新增的产品,只需要新增对应的产品类和工厂类,不需要对已有代码的修改,降低修改的风险
缺点:对于不同种类的产品,表示无能为力
3.抽象工厂模式
先举个例子,通过上面2个示例,我们制造这个产品了,但是我们有产品后,又需要去搞订单了,是不是又要创建另外的一个工厂类专门来处理订单呢?显然是不合适的,这时候,我们就会想,是不是可以把相关联的产品(产品和订单)放到一个工厂里,也就没必要再新开一个工厂了!
interface Create{ public function product(); public function order(); } class FactoryXyz implements Create{ public function product() { return new Xyz\Product; } public function order() { return new Xyz\Order; } } class FactoryAnlian implements Create{ public function product() { return new Anlian\Product; } public function order() { return new Anlian\Order; } } $factory = new FactoryXyz(); $product = $factory->product();
优点:抽象工厂模式,核心在于'一系列', 单个工厂可以生产多个相关的产品。便于在业务中切换工厂。
缺点:显而易见,当出现新的产品的时候,改动开销就很大了,需要在每个工厂类中都加入对应的产品。比如说新增了一个用户,那么就需要在这每个工厂里都加一个用户的实现了,也就是无法支持新增产品,但可以支持多个不同的工厂!
总结:这三种模式并不是说哪个一定好,具体的使用要根据对应的环境来决定的!