您的位置:首页 > 职场人生

(面试)关于简单工厂、工厂、抽象工厂模式学习心得

2018-03-14 21:29 363 查看

前言

所谓简单工厂,工厂,抽象工厂。当我一开始看到并学习这个这三个概念的时候就感觉这三个感念很相似,有点混乱,事实证明,确实让我变得很混乱。即使当初学的时候勉强看懂,但是事后便抛诸脑后,统统忘记到九霄云外了。
因此当我回过头从新理解概念时,总结了以下心得,加深理解,并且做一个备忘录。
工厂类模式设计的核心是:让“生产”和“产品”解耦。

简单工厂

所谓的简单工厂,我的理解是不用管是什么产品,我们将所有产品的生产线一股脑的都放在一个工厂里,这样工厂便可以根据用户的要求来生产各种产品。
代码如下:int prodNo;
public SimpleFactory(int prodNo) //构造工厂时告知工厂产品标识
{
this.prodNo = prodNo;
}

public IProduct GetProduct()
{
switch (prodNo) //根据产品标识生产产品
{
default:
return new ProductA();
case 1:
return new ProductA();
case 2:
return new ProductB();
}

}

}

//产品A
class ProductA: IProduct
{
//产品属性
//......
}

//产品B
class ProductB : IProduct
{
//产品属性
//......
}
//产品接口
interface IProduct
{
//产品方法
//......
}
由此我们可以看出简单工厂模式的缺陷就是,由于一个工厂里生产所有的商品,当出现新的产品时,我们需要扩展改造工厂以适应新产品的生产,这样使得“生产”和“产品”并没有解耦,并且会导致工厂无限制的扩大,难以检查维护。

工厂

基于简单工厂的缺陷,我们使用工厂模式,工厂模式就是一个工厂只生产一样产品,当需要新产品时,我们只用设计新产品和建设新工厂就行了。这样的方式使得原来的产品生产线不受新产品的影响实现了解耦。
代码如下:interface IFactory //工厂接口
{
IProduct GetProduct();
}

//A工厂类
public class FactoryA: IFactory
{
IProduct productA;
public FactoryA()
{
this.productA = new ProductA();
}

public IProduct GetProduct() //A工厂生产A产品
{
return this.productA;
}
}

//B工厂类
public class FactoryB : IFactory
{
IProduct productB;
public FactoryB()
{
this.productB = new ProductB();
}

public IProduct GetProduct() //B工厂生产B产品
{
return this.productB;
}
}

//产品接口
public interface IProduct
{
//产品方法
//......
}

//产品A
public class ProductA : IProduct
{
//产品属性
//......
}

//产品B
public class ProductB : IProduct
{
//产品属性
//......
}

抽象工厂

抽象工厂是基于工厂模式的,由上可知,工厂类只有单一的抽象产品,但是如果一个工厂可以产生多个产品,而每个产品又可以被多个工厂生产时,这时工厂模式便不能满足我们的设计需求了。因此,我们引出抽象工厂。
举个例子:比如三星是一个品牌,三星生产洗衣机,电视,冰箱;格力也是一个品牌,格力也生产洗衣机,电视,冰箱。那么,三星工厂和格力工厂生产的2个品牌的洗衣机,同时洗衣机这种产品还可以被LG,海尔,三菱等等不同的品牌的工厂生产。那么三星生产的三星洗衣机,三星电视机,三星冰箱就是三星这个工厂所能生产的产品。可能还会有西门子工厂产品,格力工厂产品,美的工厂产品等等。
代码如下://工厂接口,即抽象工厂
interface IFactory
{
IFridge CreateFridge();
IAirCondition CreateAirCondition();
}

//三星的工厂,生产三星的产品族
public class SamsungFactory : IFactory
{

public IAirCondition CreateAirCondition()
{
return new SamsungAirCondition(); //三星的工厂生产三星的空调

}

public IFridge CreateFridge()
{
return new SamsungFridge(); //三星的工厂生产三星的冰箱
}
}

//格力的工厂,生产格力的产品族

public class GreeFactry : IFactory
{
public IAirCondition CreateAirCondition()
{
return new GreeAirCondition(); //格力的工厂生产格力的空调
}

public IFridge CreateFridge()
{
return new GreeFridge(); //格力的工厂生产格力的冰箱
}
}

//冰箱产品接口
public interface IFridge
{
//冰箱产品接口
//冰箱的action
}

//空调接口
public interface IAirCondition
{
//空调产品接口
//空调的action
}

//三星的冰箱
public class SamsungFridge: IFridge
{
//三星冰箱的action和property
}
//格力的冰箱
public class GreeFridge : IFridge
{
//格力冰箱的action和property
}

//三星的空调
public class SamsungAirCondition : IAirCondition
{
//三星空调的action和property
}
//格力的空调
public class GreeAirCondition : IAirCondition
{
//格力空调的action和property
}我们可以得出结论:
1.工厂模式中,一个工厂生产一个产品,所有产品派生于同一个抽象产品(或产品接口)。
2.抽象工厂中,每个工厂都可以生产多个产品,它们是一个品牌。而不同的产品继承自不同的抽象产品接口。

总结

对于我自己的项目而言,确实使用到了简单工厂模式,所以我觉得简单工厂模式确实是一个非常好用的方法去生产自己所需要的类。同时,对于C++而言,没有java的接口概念,所以我们可以定义纯虚函数,此时的类便是抽象基类,纯虚函数便是接口。我们可以这样来实现抽象产品和抽象工厂在C++中的应用,因为接口是规范类行为的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: