被腾讯笔试打击到了,腾讯笔试的设计模式题目都没有做对过,所以我要学习下设计模式,就买了入门的《大话设计模式》这本书。
我从昨天下午开始看这本书,今天中午看完,发现这本书浅显易懂,作为入门读物还是不错的。
好脑子不如烂笔头,我还是将所学的东西记载下来,供我以后来看吧。
简单工厂模式
当需要加法类的时候,调用工厂类的CreateOperate(),要指定制造的Product
例如在大话设计模式P11给的运算工厂例子:
点击(此处)折叠或打开
- public static Operation createOperate(string operate)
-
{
- Operation oper=null;
- switch(operate)
- {
- case"+":
- {
- oper = new OperationAdd();
- break;
- }
- case"-":
- {
- oper = new OperationSub();
- break;
- }
- case"*":
- {
- oper = new OperationMul();
- break;
- }
- case"/":
- {
- oper = new OperationDiv();
- break;
- }
- }
- return oper;
-
}
- }
调用工厂,需要createOperator("/"),就能返回除法运算符。
优点:客户端不需要修改代码。
缺点: 当需要增加新的运算类的时候,不仅需新加运算类,还要修改工厂类,违反了开闭原则。
工厂方法模式
UML类图如下:
这个和简单工厂有区别,简单工厂模式只有一个工厂,工厂方法模式对每一个产品都有相应的工厂
好处:增加一个运算类(例如N次方类),只需要增加运算类和相对应的工厂,两个类,不需要修改工厂类。
缺点:增加运算类,会修改客户端代码,工厂方法只是把简单工厂的内部逻辑判断移到了客户端进行。
抽象工厂模式:
UML类图如下:
从图上可以看出这和工厂方法模式很相似,但是呢,有几个区别:
抽象工厂模式,一个具体工厂可以制造几个产品,例如微软工厂(相当于SqlserverFactory)可以制造微软鼠标(属于鼠标类,鼠标类下面有惠普鼠标,微软鼠标等,相当于上图中的IDepartment下面的SqlserverDepartment和AccessDepartment),也可以制造微软键盘(属于键盘类,键盘类下面有惠普键盘,微软键盘等,相当于上图中的IUser下面的SqlserverUser和AccessUser)。
引用http://blog.csdn.net/wangwenhui11/article/details/3955125中的话:
工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
抽象工厂模式代码
产品类:
- //发动机以及型号
- public interface Engine {
- }
- public class EngineA extends Engine{
- public EngineA(){
- System.out.println("制造-->EngineA");
- }
- }
- public class EngineBextends Engine{
- public EngineB(){
- System.out.println("制造-->EngineB");
- }
- }
- //空调以及型号
- public interface Aircondition {
- }
- public class AirconditionA extends Aircondition{
- public AirconditionA(){
- System.out.println("制造-->AirconditionA");
- }
- }
- public class AirconditionB extends Aircondition{
- public AirconditionB(){
- System.out.println("制造-->AirconditionB");
- }
- }
创建工厂类:
- //创建工厂的接口
- public interface AbstractFactory {
- //制造发动机
- public Engine createEngine();
- //制造空调
- public Aircondition createAircondition();
- }
- //为宝马320系列生产配件
- public class FactoryBMW320 implements AbstractFactory{
- @Override
- public Engine createEngine() {
- return new EngineA();
- }
- @Override
- public Aircondition createAircondition() {
- return new AirconditionA();
- }
- }
- //宝马523系列
- public class FactoryBMW523 implements AbstractFactory {
- @Override
- public Engine createEngine() {
- return new EngineB();
- }
- @Override
- public Aircondition createAircondition() {
- return new AirconditionB();
- }
- }
客户:
- public class Customer {
- public static void main(String[] args){
- //生产宝马320系列配件
- FactoryBMW320 factoryBMW320 = new FactoryBMW320();
- factoryBMW320.createEngine();
- factoryBMW320.createAircondition();
- //生产宝马523系列配件
- FactoryBMW523 factoryBMW523 = new FactoryBMW523();
- factoryBMW320.createEngine();
- factoryBMW320.createAircondition();
- }
- }