工厂模式
描述: 工厂模式主要应用于一些对象创建比较复杂的场景。
举例: 订单系统的创建(简单工厂)
创建一个<<JAVA从入门到入土>>订单
// 订单抽象类
interface IOrder {
// 创建订单
void introduce();
}
// Java订单
public class JavaOrder implements IOrder{
public void introduce(){
System.out.print("JAVA从入门到入土订单");
}
}
public class Pythonorder implements IOrder{
public void introduce(){
System.out.print("Python从入门到入土订单");
}
}
// 调用逻辑
public class Client{
public void main(String[] args){
IOrder order = new JavaOrder();
order.create();
}
}
如果这个时候,有新增了其他商品,那么在调用中就需要判断你是哪个商品。调用处代码会越来越复杂,即:
if("xx1".equals(name)){
order = new JavaOrder();
}else if(....){}
这个时候我们把订单的创建过程使用工厂模式就能很好的屏蔽创建的细节,增强代码的可读性
// 订单工厂类
public class OrderFactory{
public static IOrder create(Class<? extends IOrder> clzz) throws Exception{
IOrder order = (null == clzz ? null : clzz.newInstance());
return order;
}
}
// 调用逻辑
public class Client{
public void main(String[] args){
IOrder order = OrderFactory.create(JavaOrder.class);
order.introduce();
}
}
大家所熟悉的日历也是使用了简单工厂的方法来获取日历对象
由此我们应该已经理解工厂模式的含义。
工厂方法模式(Fatory Method Pattern)
是指定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。在工厂方法模式中用户只需要关心所需产品对应的工厂,无须关心创建细节,而且加入新的产品符合开闭原则。
上面的例子我们可以看到虽然简单工厂可以很好的隐藏产品的创建细节,而且符合开闭原则。但是加入新加入的产品的创建逻辑与其他产品不同,如果只是简单的用一个工厂来进行对象的创建的话,工厂的职责会越来越重,不便于维护。所以这个时候我们可以依据单一职责原则,专人干专事。Java产品专门有JavaFactory维护,其他的同理。这样的工厂专业俗语称之为工厂方法,接下来我们看代码示例:
// 工厂抽象接口,专人干专事
public interface IFactory{
IOrder create();
}
// Java产品工厂类
public class JavaFactory implements IFactory{
@overwrite
public IOrder create(){
return new JavaOrder();
}
}
// Python工厂类
public class PythonFactory implements IFactory{
@overwrite
public IOrder create(){
return new PythonOrder();
}
}
// 调用逻辑
public void main(String[] args){
// java
IFactory factory = new JavaFactory();
IOrder order = factory.create();
order.introduce();
// python
factory = new PythonFactory();
order = factory.create();
order.introduce();
}
同理我们看下抽象工厂在JDK里面的应用:
工厂模式除了简单工厂和工厂方法之外还有一个是抽象工厂,但是抽象工厂应用场景有限,而且不符合开闭原则,多应用于一个产品有多个产品族,比如美的集团的有空调和冰箱等。
下面是简单的代码介绍:
public interface IFactory{
IAir createAir();
IRefregerator createRefregerator();
}
// 空调接口
public interface IAir{
void warm();
}
// 冰箱接口
public interface IRefregerator{
void cold();
}
// 美的空调
public class MeidiAir implements IAir{
public void warm(){
System.sout.print("美的空调制暖");
}
}
// 美的冰箱
public class MeidiRefregerator implements IRefrgerator{
public void cold(){
System.out.print("美的冰箱制冷");
}
}
// 美的产品工厂
public class MeidiFactory implements IFactory{
public IAir createAir(){
return new MeidiAir();
}
IRefregerator createRefregerator(){
return new MeidiRefregerator ();
}
}
// 调用
public static void main(String[] args){
// 创建美的产品
IFactory factory = new MeidiFactory();
IAir air = factory.createAir();
IRefregerator refregerator = factory.createRefregerator();
//创建小米....
}
// 如果后期美的产品新增了之后,就需要修改IFactory代码,实现该接口的所有的工厂类都需要修改,所以不符合开闭原则