工厂模式
1:简单工厂模式
public interface Milk {
//获取一个标准产品
public String getName();
}
public class SanLu implements Milk {
@Override
public String getName() {
return "三路";
}
}
public class TeLunSu implements Milk {
@Override
public String getName() {
return "特仑苏";
}
}
public class YiLi implements Milk {
@Override
public String getName() {
return "伊利";
}
}
/*从简单工厂角度
增加新的品种要加新的业务逻辑,而且不利于修改
* */
public class simpleFactory {
public Milk getMilk(String name){
if("特仑苏".equals(name)){
return new TeLunSu();
}else if ("伊利".equals(name)){
return new YiLi();
}
return null;
}
}
public class Test {
public static void main(String[] args) {
//从用户角度修改新的品种需要知道牛奶的品种(实际上不知道工厂到底提供什么)
//用户不再关心生产的过程,只关心自己想要的结果
//这是小作坊标准
//用户需要指明自己要的什么牛奶,假如写了个特特呢,就会破坏程序健壮性
//用户只能选择工厂所拥有的牛奶类型,并且可以随意写任何类型,简单工厂在这里就控制不了。
System.out.println(new simpleFactory().getMilk("特仑苏"));
}
}
#1.1特点
扩展性差,想要添加新的牛奶品牌客户端和工厂都要改造。
2:工厂方法模式
#2.1模式描述
提供一个用于创建对象的接口(工厂接口),让其实现类(工厂实现类)决定实例化哪一个类(产品类),并且由该实现类创建对应类的实例。
#2.2相比于简单工厂模式的优势
- 从一定角度上进行了解耦,用户只需要有哪些工厂类。
- 可以从一定角度解耦,若要增加一个产品实现,只需要实现工厂接口。
- 可以从一定角度上增加代码的封装性以及可读性。
#2.3模式要素
- 提供一个产品类的接口。产品类均要实现这个接口(Milk接口,也可以是abstract类,即抽象产品)。
- 提供一个工厂类的接口。工厂类均要实现这个接口(Factory接口,即抽象工厂)。
- 由工厂实现类创建产品类的实例。工厂实现类应有一个方法,用来实例化产品类。
//工厂方法要加新的品种,直接加新的相关的工厂,比如SanLuFactory,实现这个接口就好了
public interface Factory {
//工厂必然有生产产品的技能,统一的产品出口
Milk getMilk();
}
public class TeLunSuFactory implements Factory {
//事情做了越来越专业
@Override
public Milk getMilk() {
return new TeLunSu();
}
}
public class YiLiSuFactory implements Factory {
//事情做了越来越专业
@Override
public Milk getMilk() {
return new YiLi();
}
}
public class FactoryTest {
public static void main(String[] args) {
//从工厂角度看
//我们在小作坊期间是生产特仑苏伊利等等牛奶,等技术成熟之后,形成了特仑苏标准,伊利标准,分工更细
//特仑苏就由特仑苏工厂去生产,伊利就由伊利工厂去生产。
//从用户角度去看 用户还得自己去选择哪个特仑苏工厂(其实跟简单工厂有点类似,还是得自己知道是什么工厂)
Factory factory=new TeLunSuFactory();
System.out.println(factory.getMilk());
}
}
3:抽象工厂
public abstract class AbstractFac {
//从工厂角度,要新加三鹿这个品种,只需要再这里告诉牛奶厂还需要加三鹿
//牛奶厂就会再去添加三鹿厂商生产新的品种牛奶。
/*
* 抽象工厂是用户的主入口
* */
public abstract Milk getTeLunSu();
public abstract Milk getYiLi();
}
public class MilkFactory extends AbstractFac {
@Override
public Milk getTeLunSu() {
return new TeLunSuFactory().getMilk();
}
@Override
public Milk getYiLi() {
return new YiLiSuFactory().getMilk();
}
}
public class AbstractFactoryTest {
public static void main(String[] args) {
/*
* 增加新的品种,用户只需要更新API,他就知道工厂能生产哪些产品,
* 不需要关心怎么生产,比如工厂方法就需要知道是使用的哪个工厂去生产的
* */
//对于用户而言更加简单,用户只有选择的权利,保证了程序的健壮性。
MilkFactory milkFactory=new MilkFactory();
System.out.println(milkFactory.getTeLunSu());
}
}
4:抽象工厂模式与工厂方法模式的区别
抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构(比如特仑苏工厂全部生产特仑苏,三鹿工厂全部生产三鹿);而抽象工厂模式则是针对的多个产品等级结构(比如牛奶工厂生产特仑苏,三鹿,伊利等牛奶,衍生的对象是同一个产品)。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类(new TeLunsuFactory(),new SanLuFactory(),new YiLiFactory()等等,衍生的对象是不同工厂)。