• 《转》java设计模式--工厂方法模式(Factory Method)


    本文转自:http://www.cnblogs.com/archimedes/p/java-factory-method-pattern.html

    工厂方法模式(别名:虚拟构造)

    定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

    概述

     当系统准备为用户提供某个类的子类的实例,又不想让用户代码和该子类形成耦合时,就可以使用工厂方法模式来设计系统。工厂方法模式的关键是在一个接口或抽象类中定义一个抽象方法,该方法返回某个类的子类的实例,该抽象类或接口让其子类或实现该接口的类通过重写这个抽象方法返回某个子类的实例。

    适用性

    1.当一个类不知道它所必须创建的对象的类的时候。

    2.当一个类希望由它的子类来指定它所创建的对象的时候。

    3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。  

    参与者

    1.Product 定义工厂方法所创建的对象的接口。

    2.ConcreteProduct 实现Product接口。

    3.Creator 声明工厂方法,该方法返回一个Product类型的对象。 Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的ConcreteProduct对象。 可以调用工厂方法以创建一个Product对象。

    4.ConcreteCreator 重定义工厂方法以返回一个ConcreteProduct实例。

    工厂方法模式的结构与使用

    模式的结构中包括四种角色:

    •抽象产品(Product)

    •具体产品(ConcreteProduct)

    •构造者(Creator)

    •具体构造者(ConcreteCreator) 

    模式的UML类图

    实战部分

    例1】:假设有三个笔芯,分别是红笔芯、蓝笔芯和黑笔芯。用户希望通过圆珠笔来明确笔芯的颜色。

    模式的结构的描述与使用 

    1.抽象产品(Product): PenCore.java

    public abstract class PenCore{
       String color;
       public abstract void writeWord(String s);
    }

    2.具体产品(ConcreteProduct)_1 : RedPenCore.java

    public class RedPenCore extends PenCore{
        RedPenCore(){
          color="红色";
        }
        public void writeWord(String s){
           System.out.println("写出"+color+"的字:"+s);
        }
    }

    具体产品(ConcreteProduct)_2 : BluePenCore.java

    public class BluePenCore extends PenCore{
        BluePenCore(){
          color="蓝色";
        }
        public void writeWord(String s){
           System.out.println("写出"+color+"的字:"+s);
        }
    }

    具体产品(ConcreteProduct)_3: BlackPenCore.java

    public class BlackPenCore extends PenCore{
        BlackPenCore(){
          color="黑色";
        }
        public void writeWord(String s){
           System.out.println("写出"+color+"的字:"+s);
        }
    }

    3.构造者(Creator): BallPen.java

    public abstract class BallPen{
        BallPen(){
           System.out.println("生产了一只装有"+getPenCore().color+"笔芯的圆珠笔");
        }
        public abstract PenCore getPenCore(); //工厂方法
    }

    4.具体构造者(ConcreteCreator):

    RedBallPen.java
    public class RedBallPen extends BallPen{
        public PenCore getPenCore(){
           return new RedPenCore();
        }
    }
    BlueBallPen.java
    public class BlueBallPen extends BallPen{
        public PenCore getPenCore(){
           return new BluePenCore();
        }
    }
    BlackBallPen.java
    public class BlackBallPen extends BallPen{
        public PenCore getPenCore(){
           return new BlackPenCore();
        }
    }

    5.应用 Application.java

    public class Application{
        public static void main(String args[]){
           PenCore penCore;
           BallPen ballPen=new BlueBallPen();
           penCore=ballPen.getPenCore();
           penCore.writeWord("你好,很高兴认识你");
           ballPen=new RedBallPen();
           penCore=ballPen.getPenCore();
           penCore.writeWord("How are you");
           ballPen=new BlackBallPen();
           penCore=ballPen.getPenCore();
           penCore.writeWord("nice to meet you");
        }
    } 

     

    工厂方法模式的优点

    •使用工厂方法可以让用户的代码和某个特定类的子类的代码解耦。

    •工厂方法使用户不必知道它所使用的对象是怎样被创建的,只需知道该对象有哪些方法即可。 

    作者:archimedes
    出处:http://www.cnblogs.com/archimedes/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

  • 相关阅读:
    【POJ 2987】Firing (最小割-最大权闭合子图)
    -网络流经典模型
    【bzoj 3299】 [USACO2011 Open]Corn Maze玉米迷宫(最短路)
    【POJ 3623】 Best Cow Line, Gold (后缀数组)
    题表-各种生成树
    yield 生成器的运行机制
    numpy.random.shuffle(x)的用法
    Softmax回归(Softmax Regression
    softmax 函数
    极大似然估计的朴素理解
  • 原文地址:https://www.cnblogs.com/fanhongyun/p/4420189.html
Copyright © 2020-2023  润新知