设计模式之工厂方法模式

    xiaoxiao2026-01-14  8

    设计模式,六大设计原则,类的特性

    总纲 http://blog.csdn.net/fenglailea/article/details/52733435 风.fox

    工厂方法模式

    定义一个用于创建对象的接口,让子类决定实例化哪一个类。

    什么是工厂方法

    工厂的一种产品生产线

    优点:客户端不需要修改代码 缺点:当需要增加新的运算类的时候,不仅需要增加运输类,还有修改工厂,违反了开闭原则

    java

    public class Factory{ public static createOperate(operate){ Operate oper=null; switch(operate){ case "+": oper= new Add(); break; case "-": oper= new Sub(); break; ... } } }

    php

    public class Factory{ public static createOperate($operate){ $oper=null; switch($operate){ case "+": $oper= new Add(); break; case "-": $oper= new Sub(); break; ... } } }

    通用类图

    组成

    1、抽象工厂:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。 2、具体工厂:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。 3、抽象产品:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。 4、具体产品:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。

    案例

    JAVA

    //产品抽象类 public abstract class Product{ //产品类的公共方法 public void method1(){ //业务逻辑 } //抽象方法 public abstract void method2(); } //具体产品类 //产品1 publict class ConcreateProduct1 extends Product{ public void method2(){ //业务逻辑 } } //产品2 publict class ConcreateProduct2 extends Product{ public void method2(){ //业务逻辑 } } //抽象工厂类 public abstract class Creator{ /** 创建一个产品对象,其输入参数类型可以自行设置 * 通常为 String,Enum,Class 等 */ public abstract <T extends Product> T createProduct(Class<T> c); } //具体工厂类 public class ConcreteCreator extends Creator{ public <T extends Product> T createProduct(Class<T> c){ Product product=null; try{ product =(Product)Class.forName(c.getName()).newInstance(); }catch (Exception e){ //异常处理 } return (T)product; } } //场景 public class Client{ public static void main(String args[]){ Crator creator =new ConcreteCreator(); Product product = creator.createProduct(ConcreteProduct1.class); ....... } }

    PHP

    //驾驶员 interface Driver{ public function driverCar(); } //汽车 interface Car{ public function drive(); } //宝马车驾驶员,开宝马 class BenzDriver implements Driver{ public function driverCar(){ return new Benz(); } } //奔驰车驾驶员,开奔驰 class BmwDriver implements Driver{ public function driverCar(){ return new Bmw(); } } //奔驰车 class Benz implements Car{ public function driver(){ echo "Driving Benz"; } } //宝马车 class Bmw implements Car{ public function driver(){ echo "Driving Bmw"; } } class Magnate{ public static functon main(){ // 需要一个奔驰车驾驶员 $driver = new BenzDriver(); //去驾驶汽车 $car =$driver->driverCar(); //GO $car->drive(); } }

    优点

    良好的封装性,代码结构清晰。 扩张性非常优秀。 屏蔽产品类 典型的解耦框架

    使用场景

    new 一个对象的替代品 需要灵活的,可扩展的框架时 可以用在异构项目中 可以使用在测试驱动开发的框架下

    最新回复(0)