一、工厂模式
工厂模式核心思想:只关心结果,隐藏复杂的过程
二、简单的工厂模式
BaoMa
/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory;/*** @author yangjikang* @date 2019/8/8 11:49* @modified By yangjikang* @since*/
public class BaoMa implements Car {private String name = "宝马";@Overridepublic String getName() {return this.name;}
}
BenChi
/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory;/*** @author yangjikang* @date 2019/8/8 11:49* @modified By yangjikang* @since*/
public class BenChi implements Car {private String name = "奔驰";@Overridepublic String getName() {return this.name;}
}
Car
/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory;/*** @author yangjikang* @date 2019/8/8 11:40* @modified By yangjikang* @since*/
public interface Car {public String getName();
}
QiRui
/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory;/*** @author yangjikang* @date 2019/8/8 11:49* @modified By yangjikang* @since*/
public class QiRui implements Car {private String name = "奇瑞";@Overridepublic String getName() {return this.name;}
}
SimpleFactory
/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory;/*** @author yangjikang* @date 2019/8/8 11:55* @modified By yangjikang* @since*/
public class SimpleFactory {public Car getCar(String name){if ("奔驰".equals(name)){return new BenChi();}else if ("奇瑞".equals(name)){return new QiRui();}else if ("宝马".equals(name)){return new BaoMa();}else{return new Car() {@Overridepublic String getName() {return "不能生产该产品....";}};}}
}
TestEnter
/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory;/*** @author yangjikang* @date 2019/8/8 11:59* @modified By yangjikang* @since*/
public class TestEnter {public static void main(String[] args) {Car baoma = new SimpleFactory().getCar("宝马");System.out.println(baoma.getName());}
}
简单工厂可以造很多种汽车品牌的车子。奔驰、宝马、奇瑞、、、、、
这样不符合实际生活,你见过哪个工厂能造这么多汽车品牌 的车子的?
下面就引伸出了 方法工厂
三、方法工厂
上面我们说了,一个汽车制造厂不可能造出很多汽车品牌的车子。所以现实生活中每个汽车品牌都有自己的工厂。
宝马有宝马汽车工厂、奥迪有奥迪汽车工厂、、、、、、
但是这些汽车工厂需要一个标准吧?不可能奥迪汽车生产的汽车有三个轮子,宝马生产的有五个轮子?
所以我们要有一个约束规则。就好比你们平时手机数据线一样,安卓的、苹果的、现在好像还有Type-c的。你见过第四种?
这就是一种约束。
BaoMaFactory
/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory.func;import com.jikang.factory.BaoMa;
import com.jikang.factory.Car;/*** @author yangjikang* @date 2019/8/8 14:06* @modified By yangjikang* @since*/
public class BaoMaFactory implements CarFactory{@Overridepublic Car getCar() {return new BaoMa();}
}
BenChiFactory
/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory.func;import com.jikang.factory.BenChi;
import com.jikang.factory.Car;
import com.jikang.factory.QiRui;/*** @author yangjikang* @date 2019/8/8 14:06* @modified By yangjikang* @since*/
public class BenChiFactory implements CarFactory{@Overridepublic Car getCar() {return new BenChi();}
}
CarFactory
/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory.func;import com.jikang.factory.Car;/*** 汽车工厂约束规则** @author yangjikang* @date 2019/8/8 14:07* @modified By yangjikang* @since*/
public interface CarFactory {Car getCar();
}
QiRuiFactory
/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory.func;import com.jikang.factory.BaoMa;
import com.jikang.factory.Car;
import com.jikang.factory.QiRui;/*** @author yangjikang* @date 2019/8/8 14:06* @modified By yangjikang* @since*/
public class QiRuiFactory implements CarFactory{@Overridepublic Car getCar() {return new QiRui();}
}
TestFuncFactory
/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory.func;import com.jikang.factory.Car;/*** 方法工厂测试类** @author yangjikang* @date 2019/8/8 14:09* @modified By yangjikang* @since*/
public class TestFuncFactory {public static void main(String[] args) {Car car = new BenChiFactory().getCar();System.out.println(car.getName());}
}
需要什么车子就去找哪个工厂造。
那么显示生活中,你想买个奔驰车,不可能还要跑到奔驰生产厂,让它去上产吧?
一般你都会去店里,跟老板说,我想买个奔驰、老板就会从奔驰厂去进货,你说你想要宝马,老板就回去宝马厂商进货。
所以你想买什么车子,直接找老板就行了。
所以就引申出了 抽象工厂
四、抽象工厂
抽象工厂肯定要有一个抽象方法。为什么要用抽象工厂呢?为什么不用简单类和接口呢?
这就说为什么我们讲问题要循序渐进。
我们一开始讲的简单工厂,缺点是什么?缺少分工,大杂烩,一个工厂做了所有工厂的事。
所以我们用方法工厂来分工。每个工厂做自己的事。
再然后我们讲了抽象工厂,就是简单工厂和方法工厂的结合。
好处是什么呢?
以前用户有简单工厂的时候用户很方便,想要什么直接跟工厂说,但是这个工厂压力肯定大啊,全国那么多人,买个车还要排队等?
后来用了方法工厂 ,工厂是方便了,但是用户复杂了,要自己去某某工厂要车子。
现在的抽象工厂模式,工厂方便了,用户也方便了。
AbstractFactory
/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory.abstr;import com.jikang.factory.BaoMa;
import com.jikang.factory.BenChi;
import com.jikang.factory.Car;
import com.jikang.factory.QiRui;/*** @author yangjikang* @date 2019/8/8 14:31* @modified By yangjikang* @since*/
public abstract class AbstractFactory {abstract Car getCar();public Car getCar(String name){if ("奔驰".equals(name)){return new BenChiFactory().getCar();}else if ("奇瑞".equals(name)){return new QiRuiFactory().getCar();}else if ("宝马".equals(name)){return new BaoMaFactory().getCar();}else{return new Car() {@Overridepublic String getName() {return "不能生产该产品....";}};}}
}
AbstractFactoryTest
/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory.abstr;/*** @author yangjikang* @date 2019/8/8 14:36* @modified By yangjikang* @since*/
public class AbstractFactoryTest {public static void main(String[] args) {DefaultAbstractFactory defaultAbstractFactory = new DefaultAbstractFactory();System.out.println(defaultAbstractFactory.getCar("asdasd").getName());}
}
BaoMaFactory
/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory.abstr;import com.jikang.factory.BaoMa;
import com.jikang.factory.Car;
import com.jikang.factory.func.CarFactory;/*** @author yangjikang* @date 2019/8/8 14:06* @modified By yangjikang* @since*/
public class BaoMaFactory extends AbstractFactory{@OverrideCar getCar() {return null;}
}
BenChiFactory
/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory.abstr;import com.jikang.factory.BenChi;
import com.jikang.factory.Car;
import com.jikang.factory.func.CarFactory;/*** @author yangjikang* @date 2019/8/8 14:06* @modified By yangjikang* @since*/
public class BenChiFactory extends AbstractFactory{@Overridepublic Car getCar() {return new BenChi();}}
DefaultAbstractFactory
/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory.abstr;import com.jikang.factory.Car;/*** @author yangjikang* @date 2019/8/8 14:36* @modified By yangjikang* @since*/
public class DefaultAbstractFactory extends AbstractFactory{private QiRuiFactory qiRuiFactory = new QiRuiFactory();@OverrideCar getCar() {return this.qiRuiFactory.getCar();}
}
QiRuiFactory
/** Copyright (C), 2013-2019, 天津大海云科技有限公司*/
package com.jikang.factory.abstr;import com.jikang.factory.Car;
import com.jikang.factory.QiRui;
import com.jikang.factory.func.CarFactory;/*** @author yangjikang* @date 2019/8/8 14:06* @modified By yangjikang* @since*/
public class QiRuiFactory extends AbstractFactory{@Overridepublic Car getCar() {return new QiRui();}
}