设计模式 创建性模式之原型模式

1 基础知识

1.1 标准定义

原型模式标准定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

1.2 分析和说明

原型模式是指用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种创建性模式。当一个系统应该独立于它的产品创建、构成和表示,以及当要实例化的类在运行时刻指定时,可使用原型模式。原型模式的缺点是每一个类都必须配备一个克隆方法。

Prototype的角色包括客户(client)角色、抽象原型(Prototype)角色和具体原型(Concrete Prototype)角色。

客户(client)角色:客户类提出创建对象的请求。

抽象原型(Prototype)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体原型所需的接口。

具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象的原型角色所需要的接口。


2 应用场景举例

比如公司对于各个产品都有自己的宣传资料。每个宣传资料的组成都是首先对公司进行介绍。其次是对公司组织结构介绍,中间内容才是对产品的技术介绍,案例说明,最后还要留下公司的联系方式。所以,对于不同的产品的宣传资料中关于公司介绍、组织机构和公司的通信地址都是一样的。这样就可以采用Prototype。从基本的公司产品资料中克隆出来一个介绍模板,然后根据具体产品再说明各个产品的技术参数。

在这里可以把AbstractPrototype理解为抽象原型角色,CompanyBaseIntroduction是具体原型角色,其类图实现如下:

        


3 Java的实现程序代码

AbstractPrototype抽象类程序代码

public abstrat class AbstractPrototype{
   public AbstractPrototype cloneMyself()   { return this;}
   public void addSomeIntroduction(String topic, String content){}
   public void deleteSomeIntroduction(String key){}
  public void showIntroduction(){}
}

CompanyBaseIntroduction具体原型代码

public class CompanyBaseIntroduction extends AbstractPrototype{
   private Map<String , String> introductionMap = new Map<String, String>();
  public CompanyBaseTntroduction(){}
  public CompanyBaseIntroduction(Map<String, String>map){
     introductionMap = map;
  }

   public AbstractPrototype cloneMyself(){
      addSomeIntroduction("公司介绍", "这是公司基本介绍");
      AbstractPrototype object = new CompanyBaseIntroduction(introductionMap);
      return object;
   }

   public void addSomeIntroduction(String topic, String content){
      introductionMap.add(topic, content);
   }

  public void deteleSomeIntroduction(String key){
     if(introductionMap.containsKey(key))  introductionMap.remove(key);
  }

  public void addIntriductionMap(Map map){
    inreoductionMap.putAll(map);
  }

  publilc Map getIntroductionMap(){
    return introductionMap;
  }

  public void showIntroduction(){
     Iterator it = introductionMap.ketSet().iterator();
     String key, value;
     while(it.hasNext()){
        key = (String)it.next();
        value = (String)introductionMap.get(key);
        System.out.println("key:"+key+" value:"+value);
     }
  }
}

测试代码

public class Client{
   public static void main(String[] args){
      CompanyBaseIntroduction company = new CompanyBaseIntroduction();
     AbstractPrototype departA = company.cloneMyself();
     departA.addSomeIntroduction("部门A介绍", “这是部门A介绍的内容”);
     departA.showIntroduction();
   }
}


输出结果:

 Key: 部门A介绍;   value:这是部门A介绍的内容

 Key: 公司介绍;   value:这是公司基本介绍



















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值