一.工厂方法模式:允许在子类中实现本类的实例化
1.作用:实例化对象的方法,即创建对象(生产产品);提供代替方法代替了调用构造函数创建新对象的通用方法;
2.实例:日记记录功能(文件存取日志 数据库记录日志 控制图记录日志)需要一个统一的接口和一个具体实现类完成。
3.各个角色类:
产品类(Product):定义了工厂方法创建的对象接口;
具体产品类(ConcreteProduct):实现产品类接口;
工厂类(Create-创建产品类 所以叫工厂类)声明工厂方法 返回一个产品类对象。可用于调用产品类对象的生成方法;
具体工厂类:(ConcreteCreate)重写用于创建具体产品类的对象的方法;
//工厂方法模式实现 对象创建逻辑
public class PetFactory{
public Pet getPet(String petType)
{
Pet prt=null;
if("Bow".equals(petType))
{
prt=new Dog();
}
else if("Meav".equals(petType))
{
prt=new Cat();
}
}
}
//使用工厂方法模式
public class FactoryMethod{
public static void main(String[] args) {
//创建工厂
PetFactory petFactory=new PetFactory();
//工厂实例化一个对象
Pet pet=petFactory.getPet("Bow");
//不知道创建哪种对象工厂??
System.out.println(pet.petSound());
}
}
4.工厂方法模式应用场景:
<1>.需要创建一个类,而编程时不确定该类的类型时(运行时确定);
<2>当一个类希望由其子类来指定多创建对象的具体类型时;
<3>想要定位被创建类,并获取其信息时;
二.抽象工厂模式:
提供一个用于创建相关对象或相互依赖对象的接口,无需指定对象的具体类
1.抽象工厂模式相比工厂方法模式的抽象层次更高(扩展--可以创建更多类型的对象),返回的是一组类的工厂;
2.各个角色类:
抽象工厂:声明一个用于完成抽象产品对象创建操作的接口;
具体工厂:实现创建具体产品对象的操作;
抽象产品:声明一个用于一类产品对象的接口;
具体产品:定义由相应的具体工厂来创建的产品对象;
客户端:使用抽象工厂和抽象产品类声明的唯一接口(客户端与其都是和关联关系,并不知道具体类实现细节);
3.抽象工厂的实际实现都是在客户端运行时决定的,客户端与具体产品类完全解耦(方便添加产品类家族);
4.屏蔽了具体产品类的创建方法---可在不同工厂(实现方法)之间进行转换;
5.抽象工厂就像工厂,而工厂方法就像工厂里的一种产品生产线:
用了工厂方法模式,你替换生成键盘的工厂方法,就可以把键盘从罗技换到微软。但是用了抽象工厂模式,你只要换家工厂,就可以同时替换鼠标和键盘一套。如果你要的产品有几十个,当然用抽象工厂模式一次替换全部最方便(这个工厂会替你用相应的工厂方法)
6.工厂方法模式与抽象工厂模式区别??