标签:rip sys 承担 hash ext 不同 reg hiberna 自己
根据名字即可了解,工厂肯定是用来生产产品的,在我们的程序开发中,需要用到不同的类,对于熟悉SSH、SSM开发的可以知道,在初期学习的时候,总是有一个框架提供好的的factory供我们使用,利用它可以创建访问数据库的连接等操作。
利用template method设计模式创建我们想要的实例,就称之为factory method。
这个例子就是实现创建一个身份证,然后使用它
product包下
- IdCard :具体的产品
- IdCardFactory :实现了具体的创建。
Factory
package base.factory.framework;
/**
* @program: DesignPatterns
* @description: 创建实例的类
* @author: Mr.Dai
* @create: 2018-05-07 15:48
**/
public abstract class Factory {
public final Product create(String name){
Product product = createProduct(name);
registerProduct(product);
return product;
}
protected abstract Product createProduct(String name);
protected abstract void registerProduct(Product product);
}
package base.factory.framework;
/**
* @program: DesignPatterns
* @description: 定义具体方法的类
* @author: Mr.Dai
* @create: 2018-05-07 15:51
**/
public abstract class Product {
public abstract void use();
}
package base.factory.idcard;
import base.factory.framework.Product;
/**
* @program: DesignPatterns
* @description: 具体的身份类
* @author: Mr.Dai
* @create: 2018-05-07 15:57
**/
public class IdCard extends Product {
private String name;
IdCard(String name){
System.out.println("创建了"+name+"的身份证");
this.name=name;
}
@Override
public void use() {
System.out.println("使用了"+name+"的身份证");
}
public String getOwer(){
return this.name;
}
}
package base.factory.idcard;
import base.factory.framework.Factory;
import base.factory.framework.Product;
import java.util.Vector;
/**
* @program: DesignPatterns
* @description: 生产身份证具体的类
* @author: Mr.Dai
* @create: 2018-05-07 16:00
**/
public class IdCardFactory extends Factory {
private Vector idcards=new Vector<String>();
@Override
public Product createProduct(String name) {
return new IdCard(name);
}
@Override
public void registerProduct(Product product) {
idcards.add(((IdCard)product).getOwer());
}
public Vector<String> getIdCards(){
return idcards;
}
}
public abstract class Factory {
public final Product create(String name){
public abstract class Factory {
public Product create(String name){
return new Product(name);//这样的话,product就不能为抽象类
package base.factory.television;
import base.factory.framework.Product;
/**
* @program: DesignPatterns
* @description: 电视类
* @author: Mr.Dai
* @create: 2018-05-07 16:40
**/
public class Televison extends Product {
private String name;
Televison(String name){
this.name=name;
}
@Override
public void use() {
open();
runing();
close();
}
public void open(){
System.out.println("开电视"+name);
}
public void runing(){
System.out.println("看电视"+name);
}
public void close(){
System.out.println("关闭电视"+name);
}
public String getName(){
return this.name;
}
}
package base.factory.television;
import base.factory.framework.Factory;
import base.factory.framework.Product;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
/**
* @program: DesignPatterns
* @description: 创建televi
* @author: Mr.Dai
* @create: 2018-05-07 16:45
**/
public class TelevisionFactory extends Factory {
private TreeMap<Integer,String> teleS=new TreeMap<>();
private int i=0;
@Override
protected Product createProduct(String name) {
return new Televison(name);
}
@Override
protected void registerProduct(Product product) {
teleS.put(++i,((Televison)product).getName());
}
public TreeMap getTeles(){
return teleS;
}
}
还有一个问题是,使用Factory Method 设计模式,必须在具体的Product作注释,不然使用者必须了解上层代码,或者维护可能会修改使用者的具体用意。
标签:rip sys 承担 hash ext 不同 reg hiberna 自己
原文地址:https://www.cnblogs.com/dgwblog/p/9003648.html