码迷,mamicode.com
首页 > 其他好文 > 详细

工厂模式

时间:2019-11-18 00:01:26      阅读:64      评论:0      收藏:0      [点我收藏+]

标签:个数   stream   end   public   rac   iter   父类   指定   override   

简单工厂

由一个工厂对象决定创建出哪一种产品类的实例。

jdk中的实例 calender

工厂方法

定义一个创建对象的接口

但让实现这个接口的类来决定实例化哪个类

工厂方法让类的实例化推迟到子类中进行。

  • 使用场景
    1. 创建对象需要大量重复代码
    2. 客户端不依赖于产品类实例如何被创建、实例等细节
    3. 一个类通过其子类来指定创建哪个对象
  • 优点:
    1. 用户只需要关心所需产品对应的工厂,无须关心创建细节
    2. 加入新产品符合开闭原则,提高可扩展性
  • 缺点
    1. 类的个数容易过多,增加复杂度
    2. 增加了系统的抽象性和理解难度

实例:

Video抽象类,定义产品

public abstract class Video {
    public abstract void product();
}

VideFactory抽象类,创建对象

public abstract class VideFactory {
    public abstract Video getVideo();
}

具体产品JavaVideo

public class JavaVideo extends Video {
    @Override
    public void product() {
        System.out.println("java视频");
    }
}

具体产品PythonVideo

public class PythonVideo extends Video {
    @Override
    public void product() {
        System.out.println("python视频");
    }
}

实例化JavaVideo,JavaVideoFactoryVideo

public class JavaVideoFactoryVideo extends VideFactory  {
    @Override
    public Video getVideo() {
        return new JavaVideo();
    }
}

实例化pythonVideo,PythonVideoFactoryVideo

public class PythonVideoFactoryVideo extends VideFactory {

    @Override
    public Video getVideo() {
        return new pythonVideo();
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        VideFactory videFactory = new JavaVideoFactoryVideo();//父类引用指向子类对象
        Video video = videFactory.getVideo(); //实例化Vido
        video.product();
        VideFactory videFactory1 = new PythonVideoFactoryVideo();//父类引用指向子类对象
        Video video1 = videFactory1.getVideo(); //实例化Vido
        video1.product();
    }
}

抽象工厂

jdk中实例:iterator 、URLStreamHandlerFactory等。

工厂模式

标签:个数   stream   end   public   rac   iter   父类   指定   override   

原文地址:https://www.cnblogs.com/PoetryAndYou/p/11878876.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!