工厂模式

创建型模式

主要思想:
产品对象由工厂创建,工厂在创建产品时,为了产品能够顺利生产出来,工厂做相应的准备工作,这些准备工作是工厂内部封装的,不向外透露细节。因此,在外部看来,我只要产品,至于你是如何生产的,我们并不关心。

两个角色

  • 产品
  • 工厂

代码结构

  • 产品:产品抽象类或接口(多态)、产品实现类
  • 工厂:工厂抽象类或接口(多态)、工厂实现类
  • 工人:调用工厂生产产品

简单模板

  • 产品抽象类
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的产地是纽约
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值