初学设计模式之工厂方法模式(FactoryMethod)

定义
定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。
结构
1、抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
2、具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
3、抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
4、具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
在这里插入图片描述
优点
1、用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
2、在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则。
缺点
1、每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。
应用场景
1、客户只知道创建产品的工厂名,而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等。
2、创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
3、客户不关心创建产品的细节,只关心产品的品牌。
应用实例
场景说明
很多种类的畜牧场,如养马场用于养马,养牛场用于养牛。
代码实现
1、定义抽象产品类

/**
 * 抽象类:动物
 */
public interface Product {
    String newAnimal();
}

2、定义具体产品类

/**
 * 具体类:猪
 */
public class ConcreteProduct1 implements Product{
    @Override
    public String newAnimal() {
        return "专业养猪";
    }
}
/**
 * 具体类:狗
 */
public class ConcreteProduct2 implements Product{
    @Override
    public String newAnimal() {
        return "专业养狗";
    }
}

3、定义抽象工厂类

/**
 * 抽象工厂:养殖场
 */
public interface AbstractFactory {
    Product show();
}

4、定义具体工厂类

/**
 * 具体工厂1:养猪场
 */
public class ConcreteFactory1 implements AbstractFactory {
    @Override
    public Product show() {
        System.out.println("我们是养猪场");
        return new ConcreteProduct1();
    }
}
/**
 * 具体工厂2:养狗场
 */
public class ConcreteFactory2 implements AbstractFactory {
    @Override
    public Product show() {
        System.out.println("我们是养狗场");
        return new ConcreteProduct2();
    }
}

5、客户端

public class Main {
    public static void main(String[] args) throws Exception{
        // 使用反射机制实例化工厂对象,因为字符串是可以通过变量改变的
        AbstractFactory pigFactory = (AbstractFactory) Class.forName("FactoryMethod.ConcreteFactory1").newInstance();
        // 通过工厂对象创建相应的实例对象
        Product pig = pigFactory.show();
        System.out.println(pig.newAnimal());

        AbstractFactory dogFactory=(AbstractFactory) Class.forName("FactoryMethod.ConcreteFactory2").newInstance();
        Product dog = dogFactory.show();
        System.out.println(dog.newAnimal());
    }
}

6、控制台输出

我们是养猪场
专业养猪
我们是养狗场
专业养狗

参考:
1、http://c.biancheng.net/view/1348.html
2、《大话设计模式》

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值