创建型模式
主要思想:
产品对象由工厂创建,工厂在创建产品时,为了产品能够顺利生产出来,工厂做相应的准备工作,这些准备工作是工厂内部封装的,不向外透露细节。因此,在外部看来,我只要产品,至于你是如何生产的,我们并不关心。
两个角色
- 产品
- 工厂
代码结构
- 产品:产品抽象类或接口(多态)、产品实现类
- 工厂:工厂抽象类或接口(多态)、工厂实现类
- 工人:调用工厂生产产品
简单模板
- 产品抽象类
public abstract class Product {
/**
* 产地
*/
protected String location;
/**
* 价格
*/
protected Integer price;
public void setLocation(String location) { this.location = location; }
public void setPrice(Integer price) { this.price = price; }
/**
* @return 获取产品名和相应价格
*/
public abstract String getNameAndPrice();
/**
* @return 产品具体描述
*/
public abstract String description();
}
- 产品实现类
//产品:Cookie
public class Cookie extends Product {
/**
* @return 获取产品名和相应价格
*/
@Override
public String getNameAndPrice() { return "cookie价格为" + this.price + "元"; }
/**
* @return 产品具体描述
*/
@Override
public String description() { return "该cookie来自" + location; }
}
//产品:Cake
public class Cake extends Product {
/**
* 味道
*/
private Taste taste;
public void setTaste(Taste taste) { this.taste = taste; }
/**
* @return 获取产品名和相应价格
*/
@Override
public String getNameAndPrice() { return "该cake的价格为" + price + "元"; }
/**
* @return 产品具体描述
*/
@Override
public String description() { return "该cake的味道是" + taste.getValue() + "\t" + "该cake的产地是" + location; }
}
//Cake所依赖的枚举Taste
public enum Taste {
SWEET("甜"),SALTY("咸");
private String value;
private Taste(String value){ this.value = value; }
public String getValue(){ return value; }
}
- 工厂抽象类
public abstract class AbstractFactory {
/**
* @return 生产的新产品
*/
public abstract Product getNewProduct(Class<? extends Product> clazz)
throws NoSuchMethodException,
IllegalAccessException,
InvocationTargetException,
InstantiationException;
}
- 工厂实现类
public class AbstractFactoryImpl extends AbstractFactory{
/**
* @return 生产的新产品
*/
@Override
public Product getNewProduct(Class<? extends Product> clazz)
throws NoSuchMethodException,
IllegalAccessException,
InvocationTargetException,
InstantiationException {
System.out.println("-----准备工作中-----");
System.out.println("-----准备工作完成,可以创建产品了-----");
return clazz.getConstructor().newInstance();
}
}
- 工人
public class Worker {
public static void main(String[] args) throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
AbstractFactory factory = new AbstractFactoryImpl();
Cookie cookie = (Cookie) factory.getNewProduct(Cookie.class);
cookie.setPrice(20);
cookie.setLocation("波士顿");
System.out.println(cookie.getNameAndPrice());
System.out.println(cookie.description());
System.out.println("邪恶分界线--------------------");
Cake cake = (Cake) factory.getNewProduct(Cake.class);
cake.setPrice(100);
cake.setLocation("纽约");
cake.setTaste(Taste.SALTY);
System.out.println(cake.getNameAndPrice());
System.out.println(cake.description());
}
}
结果:
-----准备工作中-----
-----准备工作完成,可以创建产品了-----
cookie价格为20元
该cookie来自波士顿
邪恶分界线--------------------
-----准备工作中-----
-----准备工作完成,可以创建产品了-----
该cake的价格为100元
该cake的味道是咸 该cake的产地是纽约