zoukankan      html  css  js  c++  java
  • ①设计模式 简单工厂

    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,因此客户端不知道具体实现是什么,这些都已经交给工厂了,而工厂的位置是在封装体(接口和具体的实现方式)内的,所以工厂可以知道是如何实现的。

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

     -----博主写博客不容易,转载请注明出处,谢谢:http://www.cnblogs.com/xiemubg/p/5944371.html

    君子性非异也,善假于物也!
  • 相关阅读:
    Linux常用命令
    cookie机制、session机制
    http状态码、错误分析
    安装“Microsoft SQL Server 2014 Management Objects”时报错"Error Writing to file: Microsoft.SqlServer.XEvent.Linq.dll."
    Installshield build all installer in development computer
    C++使用RabbitMQ类库做客户端与RabbitMQ Server通讯,生成C++可调用的rabbimq.*.dll的过程
    由hibernate配置cascade而导致的软件错误,并分析解决此问题的过程
    由hibernate配置inverse="true"而导致的软件错误,并分析解决此问题的过程
    JVM原理解析
    Add lombok to IntelliJ IDEA
  • 原文地址:https://www.cnblogs.com/zhaoCat/p/5958970.html
Copyright © 2011-2022 走看看