这段时间在学习设计模式,把自己学习的心得写一下,分享一下,也让大家指出一下理解上有什么不对。这是我最早接触的一个设计模式,也是大家很熟悉的。在文章的末尾会提出一个学习过程中对这个设计模式的疑问。对于这些代码的演变过程,尤其是工厂方法到抽象工厂,不知道这样理解是否正确。请大家指正下。
场景是这样的,我想开一家店,水果专卖店,但是不知道该专卖哪种水果比较赚钱。于是有了一段一下的代码:
public class Dian {
private Fruit shuiguo;
public void KaiDian(String type){
if(type.equals("苹果")){
shuiguo=new PingGuo();
}
else if(type.equals("梨")){
shuiguo=new Li();
}
else if(type.equals("香蕉")){
shuiguo=new XiangJiao();
}
...........
...........
}
}
对于以上代码,由相当多的if else组成,只有当运行时才知道要卖哪中水果。如果想加入新类型的水果或移除那么必须修改这个类,这里就是一个变化点,于是有了以下做法。
public class SimpleFruitFactory {
private Fruit shuiguo;
public Fruit createFruit(String type){
if(type.equals("苹果")){
shuiguo=new PingGuo();
}
else if(type.equals("梨")){
shuiguo=new Li();
}
else if(type.equals("香蕉")){
shuiguo=new XiangJiao();
}
........
........
return shuiguo;
}
}
以上只不过把这段代码从一个地方搬到另一个地方,仍然存在原来的毛病。但是却把对象的创建过程进行统一的管理,假如有10个客户程序用到这个创建对象的过程,按原来的做法那么必须修改10个地方,那么这么一来就只要改一个地方。这就简单工厂带来的好处。(不知道还有没有,请多说说)。但是它没有做到很好的开闭原则,对扩展不是很好。
于是,改成以下的做法,工厂方法:
public abstract class Dian {
private Fruit shuiguo;
public void KaiDian(){
shuiguo=createFruit();
.....
.....
}
public abstract Fruit createFruit();
}
这样,把对象的实例化推给Dian的子类。比如,如果我想开加苹果专卖,只要写:
public class PingGuoDian extends Dian{
public Fruit createFruit() {
return new PingGuo();
}
}
这样就算将来有新的水果类型产生,我想转去开那种水果店,也无须修改原来的代码,只要做一个店extends Dian然后由工厂方法产生我要的水果。对于扩展可以是非常好的。解决了简单工厂带来的毛病。
但是由于我很会做生意,于是店开始扩张,并不满足只卖水果了,于是,我把店用木版阁成了好几块,开始做成各种各样的专卖,有肉专卖,鱼专卖,蔬菜专卖。。。。。。。。。
于是为了好扩展,那么自然想到用工厂方法,于是产生以下做法:
public abstract class Dian {
private Fruit shuiguo;
private Rou rou;
private Yu yu;
private ShuCai shucai;
public void KaiDian() {
shuiguo = createFruit();
rou = createRou();
yu = createYu();
shucai = createShuCai();
........
........//其他操作
}
public abstract Fruit createFruit();
public abstract Rou createRou();
public abstract Yu createYu();
public abstract ShuCai createShuCai();
...........
...........//其他方法
}
那么,在这个地方,将会有许多的对象创建的抽象方法,这样就有一个毛病就是,对象的创建的抽象方法会与其他的不是对象创建的抽象方法混杂在一起,与是我们就有了类似与简单工厂的做法,把这些创建对象的抽象方法抽出来放在一个工厂里面,我们称之为抽象工厂。抽象工厂自我理解是:抽象(动词) 工厂(工厂方法)。
于是,就有了以下做法:
public abstract class AbstractFactory {
public abstract Fruit createFruit();
public abstract Rou createRou();
public abstract Yu createYu();
public abstract ShuCai createShuCai();
}
那我们的店应该就写成如下了:
public class Dian {
private Fruit shuiguo;
private Rou rou;
private Yu yu;
private ShuCai shucai;
private AbstractFactory factory;
public Dian(AbstractFactory factory){
this.factory=factory;
}
public void KaiDian() {
shuiguo = factory.createFruit();
rou = factory.createRou();
yu = factory.createYu();
shucai = factory.createShuCai();
}
}
它依赖于这个抽象工厂,我们可以看出,我的这家店并不依赖任何的具体实现,也就说你们并不知道我要专卖的系列产品是什么。刚开店的时候,在夏天,于是,我想西瓜,草鱼,猪肉,大头菜在这个季节销量比较好。于是,我开始卖这样的系列产品。于是,我叫一个专门工厂给我做了这样的产品:
public class XiaTianFactory extends AbstractFactory{
public Fruit createFruit() {
return new XiGua();
}
public Rou createRou() {
return new ZhuRou();
}
public ShuCai createShuCai() {
return new DaTouCai();
}
public Yu createYu() {
return new CaoYu();
}
}
跟这样的工厂合作(把这个工厂实力给我的店)于是就可以卖这样的系列的产品了。
到了冬天,西瓜不好销售了,转而香蕉销售比较好,狗肉销量大增了,于是我想卖狗肉,大头菜不新鲜了,而土豆比较新鲜。。。。。。。于是我想换产品系列了,那么我们我只要换家工厂合作即可,我并不需要把店拆了,在重新开一家。
以上就是我从简单工厂--工厂方法--抽象工厂的理解。理解尚浅,请各位前辈给于补充和指正。
问题的提出:看过一些资料,把工厂方法写成这样。如,我们把上面工厂方法那段改成的写法:
public abstract class AbstractFactory {
public abstract Fruit createFruit();
}
public class Dian {
private Fruit shuiguo;
public Dian(AbstractFactory factory){
this.factory=factory;
}
public void KaiDian() {
shuiguo = factory.createFruit();
}
}
个人觉的这个其实就是抽象工厂,只不过你的系列产品只有一个而已。我们对工厂方法的定义中其中有一个是:把实例化推迟给子类,那么以上的做法是不是并没有按照这个???因为我的店已经是具体类了,怎么推迟给子类?反而的更象是抽象工厂吧。个人还觉的工厂方法与抽象工厂的区别在与,工厂方法是通过继承,转而把实例化对象交给子类处理,而抽象工厂是通过组合,组合一个抽象工厂,由抽象工厂提供。不过看了一些资料都把以上想法说成是工厂方法,不知道是不是我哪里还没体会到,请各位指正下,学习中。。。。。。。。。。
分享到:
相关推荐
本篇文章将对三种主要的工厂模式:简单工厂、工厂方法和抽象工厂进行深入的对比和总结。 **简单工厂模式** 是最基础的工厂模式形式,它提供一个静态方法或类来创建对象。在这个模式中,工厂是负责创建对象的中心...
在软件设计模式中,工厂模式是一组非常基础且实用的设计模式,主要分为简单工厂模式、工厂方法模式和抽象工厂模式。这些模式都是为了解决对象创建的问题,通过封装对象的创建过程,使得代码更加灵活,易于扩展和维护...
设计模式专题之(三)抽象工厂模式---设计模式抽象工厂模式示例代码(python--c++)
熵增教育-熵增学院VIP精品课程录播:简单工厂模式-工厂方法模式-抽象工厂模式
工厂模式分为三种主要类型:简单工厂模式、工厂方法模式和抽象工厂模式。 1. **简单工厂模式** 简单工厂模式是最简单的工厂模式实现,它提供一个静态方法或者类来创建对象,这个类通常被称为“工厂”。用户只需要...
这些工厂通常会覆盖抽象工厂中定义的方法,生成特定于自己的产品。 3. **抽象产品**:定义了产品的接口,通常为接口或者抽象类,比如`ProductA`和`ProductB`。这些抽象产品代表了不同种类的对象,它们之间可能存在...
在软件设计模式中,工厂方法模式和抽象工厂模式是两种常用的创建型模式,它们都用于对象的创建,但各有特点和适用场景。首先,我们来理解这两种模式的基本概念。 **简单工厂模式**: 简单工厂模式是一种较为初级的...
工厂方法模式和抽象工厂模式是两种常见的设计模式,它们都属于创建型模式,用于解决对象的创建问题。在软件设计中,这两种模式都是用来隔离对象的创建和使用,以提高系统的灵活性和可扩展性。 首先,工厂方法模式的...
工厂方法、简单工厂和抽象工厂是创建型设计模式的三种不同形式,它们都关注于对象的创建过程,但各有其特点和适用场景。 1. **工厂方法(Factory Method)**: 工厂方法模式定义了一个创建对象的接口,但让子类...
首先,我们需要定义一个抽象工厂接口,例如`PhoneFactory`,这个接口声明了一系列创建手机零部件的方法,如`createScreen()`, `createOperatingSystem()`, `createCamera()`。这些方法返回的是各个品牌的特定零部件...
在软件设计模式中,"抽象工厂"、"工厂方法"和"简单工厂"都是创建型设计模式,它们都用于封装对象的创建过程,提供了一种间接的途径来创建对象,从而使得代码更加灵活,易于扩展。下面将详细介绍这三个工厂模式。 ##...
抽象工厂-设计模式-主要介绍怎么样创建抽象工厂并实现数据库创建
在软件设计模式中,工厂方法(Factory Method)和抽象工厂(Abstract Factory)是两种非常重要的创建型模式。它们主要用于解决对象实例化的问题,提供了一种封装对象创建过程的方法,使得代码更加灵活,易于扩展和...
本文将深入探讨Java中的工厂模式,包括基本的工厂模式、抽象工厂模式以及工厂方法模式。 **工厂模式**:工厂模式的核心思想是提供一个创建对象的接口,但让实现这个接口的类来决定实例化哪一个类。这样,客户端无需...
抽象工厂模式是一种高级的设计模式,属于创建型模式,它提供了一种创建对象族的方法,而无需指定其具体的类。在PHP中,抽象工厂模式尤其适用于那些需要创建一系列相关或相互依赖的对象,而又不希望硬编码具体类名的...
4. 创建多个实现抽象工厂的子类,每个子类对应一个具体产品类,实现抽象工厂中的产品创建方法。 5. 在客户端代码中,通过具体工厂类来创建需要的产品对象。 三、工厂方法模式的优势 1. 封装性:将产品对象的创建...
工厂模式分为三种主要类型:简单工厂模式、普通工厂模式(也称为工厂方法模式)和抽象工厂模式。 1. **简单工厂模式**: - 简单工厂模式中,有一个中心工厂类,它负责根据输入条件(通常是一个参数)来创建具体的...
2. 创建具体工厂类,继承自抽象工厂,实现抽象工厂中定义的创建产品的方法,具体创建相应的产品对象。 3. 定义抽象产品接口,定义产品的公共行为。 4. 创建具体产品类,实现抽象产品接口,定义各自的具体行为。 5. ...
抽象工厂模式可以帮助我们创建一个工厂接口,该接口声明了创建这些组件的方法,然后为每种操作系统实现一个具体的工厂类。 ```java // 抽象工厂接口 public interface GUIFactory { Button createButton(); ...
抽象工厂模式的核心是提供一个抽象的工厂接口,该接口定义了一组用于创建产品的方法,而不需要指定具体的类。具体的工厂类继承该接口,并实现了这些方法以创建具体的产品。 抽象工厂模式的优点包括: * decoupling...