工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、问题描述

问题1.图形工厂
  使用简单工厂模式设计一个可以创建不同几何形状(Shape)的绘图工具类,如可创建圆形(Circle)、矩形(Rectangle)和三角形(Triangle)对象,每个几何图形均具有绘制draw()和擦除erase()两个方法,要求在绘制不支持的几何图形时,抛出一个UnsupportedShapeException异常,设计类图并编程实现。
问题2.图片读取器
  某系统设计一个图片读取器(ImageReader),用来读取各种不同类型的图片格式,例如GIF图片读取器(GifReader)用于读取GIF格式的图片、 JPG图片读取器(JpgReader)用于读取JPG格式的图片,现使用工厂方法模式设计该系统类图并编程实现。
问题3.电器工厂
  一个电器工厂可以产生多种类型的电器,如海尔工厂可以生产海尔电视机、海尔空调等,TCL工厂可以生产TCL电视机、TCL空调等,相同品牌的电器构成一个产品族,而相同类型的电器构成了一个产品等级结构,现使用抽象工厂模式模拟该场景,设计类图并编程实现

二、问题分析

问题一类图:

在这里插入图片描述

问题二类图:

在这里插入图片描述

问题三类图:

在这里插入图片描述

三、几个工厂模式优缺点

简单工厂模式:

1.简单工厂模式的优点

  方便扩展算法,比如增加图形,我们只要继续增加图形类就行了,同时客户端也就是使用者不知道具体的实现细节,只要给出相关标示符,工厂函数就马上给他创建一个他想要的实体就行了。减少了使用者和功能开发者之间的耦合度。

2.简单工厂模式的优点

  在进行扩展的时候,我们要更改工厂函数里面的对应函数,这样便破坏了OCP,而且当有多级结构继承的时候,简单工厂就会因为只能对应平行一层记得继承,不得不使得好多类继承同一个接口,然后得到A*B这么多的工厂实体可能,工厂函数很难维护

工厂方法模式:

1.工厂方法模式的优点

  算法实体的创建被延迟到了工厂子类里,我们不在工厂里直接创建对象,而是直接封装一个一个的小工厂,每个工厂负责创建自己的子类,满足了OCP。

2.工厂方法模式的优点

  如果算法种类很多,那么继承抽象工厂的子类也就会很多,不是很好维护,同时不支持产品切换。

抽象工厂模式:

1.抽象工厂模式的优点

  首先是满足OCP的,而且可以满足产品切换,能实现的前提是比如A和B两个产品,它们有1和2两个方法接口(类),现在我们在增加新的产品C(假设也是只有1和2两个方法接口),我们要做的只是增加一个产品类再增加一个工厂类就行了,如果是简单工厂或者是工厂方法的的话通常都是增加两个算法类C.1,C.2,简单工厂需要修改switch增加两个语句,工厂方法是在增加两个工厂类,可见抽象工厂的优点。

2.抽象工厂模式的优点

  工作量繁杂。

四、代码及结果

简单工厂模式:

ShapeModel接口:

public interface ShapeModel {
  void draw();
  void erase();
}

Rectangle类(其他两个类似):

public class Rectangle implements ShapeModel{
    @Override
    public void draw() {
        System.out.println("绘制了一个矩形");
    }
    @Override
    public void erase() {
        System.out.println("擦除了一个矩形");
    }
}

UnsupportedShapeException类:

public class UnsupportedShapeException extends Exception{
    public UnsupportedShapeException() {
        super();
    }
    public UnsupportedShapeException(String message) {
        super(message);
    }
    public UnsupportedShapeException(String message, Throwable cause) {
        super(message, cause);
    }
    public UnsupportedShapeException(Throwable cause) {
        super(cause);
    }
    protected UnsupportedShapeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

ShapeFactory类:

public class ShapeFactory {
    public ShapeModel CreateShape(String name) throws UnsupportedShapeException{
        if (name.equals("圆形")) {
            return new Circle();![在这里插入图片描述](https://img-blog.csdnimg.cn/20ab04fee58d4936a7a98c67ad691552.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rC05pyoIOa4heWNjg==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)

        } else if (name.equals("矩形")) {
            return new Rectangle();
        } else if (name.equals("三角形")) {
            return new Triangle();
        }else {
            throw new UnsupportedShapeException("不支持绘画该图形");
        }
    }
    public  static  void main (String args[]) throws UnsupportedShapeException {
        ShapeModel model1 ;
        ShapeFactory factory1 = new ShapeFactory();
        model1 = factory1.CreateShape("圆形");
        model1.draw();
        model1.erase();
        model1 = factory1.CreateShape("矩形");
        model1.draw();
        model1.erase();
        model1 = factory1.CreateShape("三角形");
        model1.draw();
        model1.erase();
        model1 = factory1.CreateShape("1");
    }
}

运行结果:
在这里插入图片描述

工厂方法模式:

FactoryImageReader接口:

public interface FactoryImageReader {
    ImageReader CreatImageReader();
}
ImageReader接口:
public interface ImageReader {
    void Reader();
}

GifReader实例(另一个类似):

public class GifReader implements ImageReader{
    public void  Reader()
    {
        System.out.println("这是Gif reader");
    }
}

JpgReaderFactory实例(另一个类似):

public class JpgReaderFactory implements FactoryImageReader{
    public ImageReader CreatImageReader(){
        return  new JpgReader();
    }
}

Test测试类:

public class Test {
    public static void main(String args[])
    {
        FactoryImageReader factory1;
        factory1 = new JpgReaderFactory();
        ImageReader Reader1 ;
        Reader1 = factory1.CreatImageReader();
        Reader1.Reader();
        factory1 = new GifReaderFactory();
        Reader1 = factory1.CreatImageReader();
        Reader1.Reader();
    }
}

运行结果为:
在这里插入图片描述

抽象工厂模式:

AirConditioner接口:

public interface AirConditioner {
    void display();
}

Factory接口:

public interface Factory {
    television CreateTV();
    AirConditioner CreateConditioner();
}

Television接口:

public interface television {
    void display();
}

HaierFactory类(另一个类似):

public class HaierFactory implements Factory{
    public television CreateTV()
    {
        return new HaierTv();
    }
    public AirConditioner CreateConditioner()
    {
        return new HaierConditioner();
    }
}

HaierConditioner类(另一个类似):

public class HaierConditioner implements AirConditioner{
   public void display()
    {
        System.out.println("这是海尔空调");
    }
}

HaierTv类(另一个类似):

public class HaierTv implements television{
    @Override
    public void display() {
        System.out.println("这是海尔电视");
    }
}

Test类(另一个类似):

public class Test {
    public static void main(String args[])
    {
        Factory factory1 ;
        television TV;
        AirConditioner conditioner;
        factory1 = new HaierFactory();
        TV =  factory1.CreateTV();
        TV.display();
        conditioner = factory1.CreateConditioner();
        conditioner.display();
        factory1 = new TCLFactory();
        TV =  factory1.CreateTV();
        TV.display();
        conditioner = factory1.CreateConditioner();
        conditioner.display();
    }
}

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水木 清华

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值