惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
B
Blog
S
SegmentFault 最新的问题
Vercel News
Vercel News
博客园 - 聂微东
宝玉的分享
宝玉的分享
C
Check Point Blog
有赞技术团队
有赞技术团队
IT之家
IT之家
V
V2EX
爱范儿
爱范儿
GbyAI
GbyAI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Microsoft Azure Blog
Microsoft Azure Blog
P
Proofpoint News Feed
博客园 - 司徒正美
博客园_首页
Last Week in AI
Last Week in AI
博客园 - 叶小钗
量子位
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
F
Fortinet All Blogs
腾讯CDC
J
Java Code Geeks

博客园 - mshwu

桥接模式(Bridge Pattern) 单例模式 命名空间的规划 Download Manager Intent(二) Intent (一) Fragment (一) 2-1 Managing the Activity Lifecycle java1.5新特性(转) 1-4 Starting Another Activity 1-3 Building a Simple User Interface(创建简单的用户界面) 1-2 Android系统架构基本模式解析 1-1 Building Your First Android Application FTP Send File: Source Code Review(转) 动态操作文件 通用日志管理工具 触发器程序 通过CLP实现library之间的自动复制 (转) OVRDBF的用法
工厂方法模式
mshwu · 2013-09-26 · via 博客园 - mshwu

工厂方法模式

Posted on 2013-09-26 22:43  mshwu  阅读(309)  评论()    收藏  举报

1,定义

          所谓工厂方法模式(Factory Method Pattern),就是定义一个创建产品对象的工厂接口,让子类决定实例化哪一种实例对象,也就是将实际创建实例对象的工作推迟到子类当中,核心工厂类不再负责具体产品的创建。

2,优点

  • 简单工厂模式的进一步抽象,可以使系统在不修改具体工厂角色的情况下引进新的产品, 完全实现“开-闭”原则, 对扩展开发,对修改关闭
  • 依赖于抽象,而不是具体的实现类, 大大降低了客户程序与实现细节的耦合度
  • 可以使代码结构清晰,有效地封装变化。在编程中,产品类的实例化有时候是比较复杂和多变的,通过工厂模式,将产品的实例化封装起来,使得调用者根本无需关心产品的实例化过程,只需依赖工厂即可得到自己想要的产品。

3, 使用场合

  • 当子类可能会很多, 以后需要不断的增添子类实现时;
  • 当一个系统尚在框架设计阶段,还不知道将来需要实例化哪些具体类时;
  • 系统设计之初不需要具体对象的概念

    image

通过工厂方法模式的类图可以看到,工厂方法模式有四个要素:

  • 工厂接口:工厂接口是工厂方法模式的核心,与调用者直接交互用来提供产品。
  • 具体工厂:具体工厂决定如何实例化产品,是实现扩展的途径,需要有多少种产品,就需要有多少个具体的具体工厂。
  • 抽象产品:抽象产品的主要目的是定义产品的规范,所有的具体产品都必须遵循抽象产品所定义的规范。
  • 具体产品:抽象产品的具体实现,决定了产品在客户端中的具体行为。

抽象工厂生产抽象产品,具体工厂生产具体产品       

工厂接口

public  interface ICreateCar  {
    public AbstractCar createCar() ;

}

具体工厂

public  class FactoryKindCar  implements ICreateCar {
    @Override
    public AbstractCar createCar() {
        
        return new KindCar("KindCar","Red"); 
    }    
 }

抽象产品

public  abstract class AbstractCar  {
    protected String name;
    protected String color;

    public abstract void start();    

 }

具体产品

public  class KindCar extends AbstractCar  {

    public KindCar(String name,String color)
    {
        this.name = name;
        this.color = color;
    }
    @Override
    public void start() {
        
        System.out.println("The car "+this.name+" color with "+this.color+" is running!");
        
    }

 }

下面建立一个客产测试程序:

public class FactoryMethodTesting {

    public static void main(String[] str)
    {
        ICreateCar createcar = new FactoryKindCar();
        AbstractCar car = createcar.createCar();
        car.start();
    }
    
}

这里突出一个原则,永远面向抽象及接口编程,而不是具体实现, 假如有一种新的车要增加,我们只需添加一个具体产品与具体工厂, 丝毫不会影响原来的应用逻辑,支持“开-闭原则。

动行结果

image