做空调的网站,莲花网名,全国优秀施工企业查询,北京公司注册网址为什么要用设计模式#xff1f;根本原因是为了代码复用#xff0c;增加可维护性。 面向对象设计坚持的原则#xff1a;开闭原则#xff08;Open Closed Principle#xff0c;OCP#xff09;、里氏代换原则#xff08;Liskov Substitution Principle#xff0c;LSP… 为什么要用设计模式根本原因是为了代码复用增加可维护性。 面向对象设计坚持的原则开闭原则Open Closed PrincipleOCP、里氏代换原则Liskov Substitution PrincipleLSP、依赖倒转原则Dependency Inversion PrincipleDIP、接口隔离原则Interface Segregation PrincipleISP、合成/聚合复用原则Composite/Aggregate Reuse PrincipleCARP、最小知识原则Principle of Least KnowledgePLK也叫迪米特法则 开闭原则模块应该对扩展开放而对修改关闭。也就是说在不修改原来的代码的前提下进行扩展。里氏代换原则如果调用的是父类的话那么换成子类也完全没有问题。依赖倒转原则尽量针对接口编程而不是针对实现编程。通过抽象父类的指针来调用子类的实现。接口隔离原则每个接口应该只有一种角色多个角色应该用多个接口来实现。合成/聚合复用在新的对象中尽量使用已有的对象使新对象向这些对象委派来达到复用已有功能的目的而不是通过继承来实现。最少知识原则一个对象应对其它对象有尽可能少的了解。 上述的这些原则也正是体现了OOP高内聚、低耦合的基本原则最终目的都是为了代码复用增加可维护性。设计模式就是本着这些原则来进行OOP设计的一些方法。 设计模式开篇先来介绍工厂方法Factory Method模式 对象创建型模式的一种。工厂方法是定义一个用于创建对象的接口让子类决定实例化哪一个类让一个类的实例化延迟到它的子类中。 客户Client工厂接口Creator工厂实现类ConcreteCreatorP1和ConcreteCreatorP2产品接口Product产品实现类ConcreteProductP1和ConcreteProductP2 上面是工厂方法模式的类图。 首先我们有两个产品ProductP1和ProductP2我们现在要生产这两个产品这两个产品特征如下 (1) start(); 启动 (2) execute(); 运行 (3) quit(); 退出 只是启动过程不同运行过程不同退出也不同。 那么工厂方法模式是如何实现得到这两个产品的对象的呢通过上面的类图其实我们就可以大概知道了工厂方法大致实现过程。有几个产品就对应着有几个工厂每个工厂负责生产对应的产品。所有工厂都实现了同一个工厂接口Creator。而所有的产品也都实现了同一个产品的接口Product。 Product定义工厂方法所创建的对象的接口也就是产品的接口 class Product{Product(){};~Product(){};virtual void start()0;virtual void execute()0;virtual void quit()0;
}; ConcreteProduct实现Product接口也就是每个产品具体的实现方法这里有两个产品ConcreteProductP1和ConcreteProductP2 /**************************产品1*******************************/class ConcreteProductP1:public Product{ConcreteProductP1(){};~ConcreteProductP1(){};void start();void execute();void quit();
};
ConcreteProductP1::start(){cout----------P1 启动----------endl;
}
ConcreteProductP1::execute(){cout----------P1 执行----------endl;
}
ConcreteProductP1::quit(){cout----------P1 退出----------endl;
}
/*************************产品2********************************/
class ConcreteProductP2:public Product{ConcreteProductP2(){};~ConcreteProductP2(){};void start();void execute();void quit();
};
ConcreteProductP2::start(){cout----------P2 启动----------endl;
}
ConcreteProductP2::execute(){cout----------P2 执行----------endl;
}
ConcreteProductP2::quit(){cout----------P2 退出----------endl;
} Creator声明工厂方法该方法返回一个Product类型的对象Creator也可以定义一个工厂方法的缺省实现它返回一个缺省的ConcreteProduct对象可以调用工厂方法以创建一个Product对象 class Creator{
public:Creator(){};~Creator(){};virtual Product* createProduct()0;
}; ConcreteCreator重定义工厂方法以返回一个ConcreteProduct实例这里有两个工厂实现类各自对应上面的两个产品 /*************************工厂1生成产品1**************************/
class ConcreteCreatorP1:public Creator{
public:ConcreteCreatorP1(){};~ConcreteCreatorP1(){};Product* createProduct();
};
Product* ConcreteCreatorP1::createProduct(){return new ConcreteProductP1();
}/*************************工厂2生成产品2**************************/
class ConcreteCreatorP2:public Creator{
public:ConcreteCreatorP2(){};~ConcreteCreator()P2{};Product* createProduct();
};
Product* ConcreteCreatorP2::createProduct(){return new ConcreteProductP2();
} Client 这里使用的是main函数 int main(){Creator *factory new ConcreteCreatorP1();Product *p1 factory.createProduct();p1.start(); //p1是这样启动的p1.execute(); //p1是这样运行的p1.quit(); //p1是这样结束的Creator *factory new ConcreteCreatorP2();Product *p2 factory.createProduct();p2.start(); //p2是这样启动的p2.execute(); //p2是这样运行的p2.quit(); //p2是这样结束的return 0;
} 工厂方法很简单经常作为一种标准的创建对象的方法。但是缺点就是可能仅仅是为了改变产品类就可能需要创建一个新的类也就是说当被实例化的类根本不发生变化或当实例化出现在子类可以很容易重定义的操作中重新创建一个工厂类就显得太浪费了。 版权所有欢迎转载转载请注明出处。 转载于:https://www.cnblogs.com/whc-uestc/p/4750948.html