设计模式之我见工厂设计模式一

这学期新开了设计模式这门课程,老师要求让写实验报告,那么我也就在CSDN上同步下自己的实验报告吧!
先写第一篇简单的工厂设计模式吧!温馨提示:这是个连续剧!
在Java语言中,对象有多种创建方式

  • 使用new关键字直接创建对象
  • 通过反射机制创建对象
  • 通过clone方法创建对象
  • 使用反序列化创建对象

工厂模式分为简单工厂模式、工厂方法模式、抽象工厂模式。简单工厂模式,简单实现对象创建与使用的分离,又称为静态工厂方法模式,它属于类创建型模式。在简单工厂模式中,根据参数的不同返回不同类的实例。看代码:

public abstract class BallPen {
    
    
    BallPen() {
    
    
        System.out.println("生产了一只装有"+getPenCore().color+"笔芯的圆珠笔");
       }
    public abstract PenCore getPenCore();
}

就比如在笔与笔芯中定义了一个抽象类BallPen,它有一个构造函数,用于创建类的实例。当调用构造函数时,它会向控制台打印一条消息,表明已经生产出一支具有特定颜色笔芯的圆珠笔。它有个名为getPenCore()的抽象方法。此方法返回抽象类PenCore的一个实例。
所以该类的目的就是提供一个模板来创建不同类型的圆珠笔。圆珠笔使用的具体笔芯类型由扩展BallPen的子类决定,通过将getPenCore()定义为抽象方法,BallPen允许每个子类实现该方法的自己版本并返回它使用的特定类型的PenCore.

public abstract class PenCore {
    
    
    String color;
    public abstract void writeWord(String s);
}

PenCore抽象类有一个颜色实例变量,表示笔芯的颜色和一个抽象方法writWord(),表示使用该笔芯写字时的行为。 由于这两个类都是抽象的,所以它们不能直接实例化。相反,它们必须由实现其抽象方法的子类来扩展。

public class BlueBallPen extends BallPen{
    
    
    public PenCore getPenCore(){
    
    
       return new BluePenCore();
    }
}

同时BuleBallPen继承了BallPen方法 ,因为是抽象类,它必须实现父类的PenCore方法,所以BuleBallPen返回自己的BluePenCore实例对象。

public class BluePenCore extends PenCore{
    
    
    BluePenCore(){
    
    
      color="蓝色";
    }
    public void writeWord(String s){
    
    
       System.out.println("写出"+color+"的字:"+s);
    }
}

所以当PenCore的子类重写方法它的具体笔芯类型就是由子类决定。
比如当蓝色笔芯继承了PenCore。重写了writeWord方法打印出“写出了传入color类型的字”。

    public static void main(String args[]){
    
    
       PenCore penCore;
       BallPen ballPen=new BlueBallPen();
       penCore=ballPen.getPenCore();
       penCore.writeWord("你好,很高兴认识你");

    }

所以在main函数中,第一行定义了PenCore penCore;
因为PenCore是抽象方法不能实例化,但是抽象类可以声明对象,声明一个抽象类类型的变量时,变量本身可以被实例化为null,虽然我们无法直接实例化对象,但我们可以使用该变量penCore来引用任何PenCore的具体子类的实例。

所以在代码的第4行,我们把pencore引用了ballPen的getPenCore方法来获取一个PenCore对象,这样就是引用了PenCore的子类的实例。

Main函数第2行Ball ballPen = new BlueBallPen();我们new了一个BlueBallPen使用了向上转型(向上转型就是把子类对象直接赋给父类引用,不用强制转换。使用向上转型可以调用父类类型中的所有成员,不能调用子类类型中特有成员,最终运行效果看子类的具体实现),用父类类型的变量来引用子类对象,从而在运行时动态选择用哪个具体的实现类,也就是动态绑定机制。
同时子类初始化继承父类需要调用父类的构造方法,而父类BallPen中就有个默认构造函数。

  BallPen() {
    
    
    System.out.println("生产了一只装有"+getPenCore().color+"笔芯的圆珠笔");
   }

所以当创建BlueBallPen对象时,它会调用其父类BallPen的构造函数,而BallPen又会调用getPenCore()方法来获取BluePenCore对象。而BluePenCore构造函数将颜色字段设置为“蓝色”。当BallPen构造函数打印消息时,它访问getPenCore()返回的PenCore对象也就是BluePenCore对象的颜色字段,该字段已设置为“蓝色”,就会输出“生产了一支装有蓝色笔芯的圆珠笔”。
接下来就是输出BluePenCore重写的writeWord方法写出蓝色的字“很高兴认识你”。
在这里插入图片描述
你可以用debug方式看代码的执行顺序。
那么我现在不想用蓝色圆珠笔了,我想用黑色的。就可以这样写

public class BlackBallPen extends BallPen{
    
    
    public PenCore getPenCore(){
    
    
       return new BlackPenCore();
    }
}
public class BlackPenCore extends PenCore{
    
    
    BlackPenCore(){
    
    
      color="黑色";
    }
    public void writeWord(String s){
    
    
       System.out.println("写出"+color+"的字:"+s);
    }
}

在这里插入图片描述

控制台就会输出装有黑色笔芯的圆珠笔写下一句话: nice to meet you。
所以嘛,BallPen类就像一个工厂负责生产圆珠笔,PenCore代表抽象产品(即墨盒),而BluePenCore是该产品的具体体现,你需要什么颜色就提供什么颜色。这允许生产具有不同墨盒的不同类型的笔,同时使客户端代码与特定的笔和墨盒实现分离。这就是简单工厂的设计模式。

以上就是今天的内容了,如果还想看下一篇请点击个关注吧!

猜你喜欢

转载自blog.csdn.net/m0_56653797/article/details/129652424