每天一个设计模式-1 简单工厂

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每天一个设计模式-1 简单工厂相关的知识,希望对你有一定的参考价值。

每天一个设计模式-1  简单工厂

1.简单工厂的定义

    提供一个创建对象实例的功能,无须关心其具体实现(核心)。

    虽然不能让模块外部知道模块内部的具体实现,但模块内部是可以知道具体实现类的。干脆在模块内部建一个类,用这个类来创建接口,然后把创建号的接口返回给客户端;这样,外部应用就只需要根据这个类来获取相应的接口对象,通过这个接口对象就可以操作接口定义的方法了。显然,这个类就像一个工厂专门用来生成(生产)需要的接口对象。

2.简单的例子

说明:

技术分享

代码:

 Api:接口,wear是一个公有方法。

技术分享
public interface Api {

    public void wear();

}
Api

impl1:男生穿男士衣服的实现wear。

技术分享
public class Impl1 implements Api {

    public Impl1(){

    }

    public void finalize() throws Throwable {

    }

    public void wear(){
        System.out.println("男生穿男士衣服");
    }

}
Impl1

impl2:女生穿女士衣服的实现wear。

技术分享
public class Impl2 implements Api {

    public Impl2(){

    }

    public void finalize() throws Throwable {

    }

    public void wear(){
        System.out.println("女士穿女士衣服");
    }
}
Impl2

Factory:工厂类,通过选择产生合适接口对象。

技术分享
public class Factory {

    public Factory(){

    }

    public void finalize() throws Throwable {

    }

    /**
     * 
     * @param sex
     */
    public static Api GetInstance(String sex){
        if(sex=="男"){
            return new Impl1();
        }else{
            return new Impl2();
        }
    }
}
Factory

Client:用户类

技术分享
public class Client {

    public static Api m_Api;

    public Client(){

    }

    public void finalize() throws Throwable {

    }

    /**
     * 
     * @param args
     */
    public static void main(String[] args){
        System.out.println("男生");
        m_Api = Factory.GetInstance("男");
        m_Api.wear();
        System.out.println("女生");
        m_Api = Factory.GetInstance("女");
        m_Api.wear();
    }

}
Client

3.变通

    Factory的参数的来源:

1.来源于客户端。

2.来源于配置文件。
创建一个properties文件,内容可以是具体的实现类(依靠java的反射机制完成对象的创建,这样也可以避免当有新的实现类时还要修改工厂代码)、参数等

3.来源于程序运行期的某个值。

4.优缺点

优点:

    帮助封装:使组件外部真正的面向接口编程

    解耦:客户端不知道内部的具体实现

缺点:   

    可能增加客户端的复杂度:用户可能需要知道各个参数所代表的含义,并部分暴露了内部实现。

    不方便创建子工厂:使用静态方法来创建接口,也就不能通过写简单工厂类的子类来改变创建接口的方法的行为了,但一般不需要这么做。

5.总结

    客户端通过简单工厂创建一个实现接口的对象,然后面向接口编程,从客户端来看,他根本不知道具体的实现是什么,也不知道是如何实现的。因为我们在工厂内去new的具体实现对象,并没有在客户端内去new,因此客户端不知道具体实现是什么,这些都已经交给工厂了,而工厂的位置是在封装体(接口和具体的实现方式)内的,所以工厂可以知道是如何实现的。

    因此,简单工厂的主要思想就是将具体实现与客户隔离

 

 

 

 

以上是关于每天一个设计模式-1 简单工厂的主要内容,如果未能解决你的问题,请参考以下文章

[大话设计模式]学习笔记——简单工厂模式

简单工厂模式---计算器

简单的工厂模式

每天一个设计模式-5 工厂方法模式

每天一个设计模式,工厂方法模式(Factory Method)

设计模式简单工厂模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )