一、工厂模式
工厂模式核心思想:只关心结果,隐藏复杂的过程
二、简单的工厂模式
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 = "宝马";
@Override
public 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 = "奔驰";
@Override
public 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 = "奇瑞";
@Override
public 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() {
@Override
public 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{
@Override
public 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{
@Override
public 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{
@Override
public 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() {
@Override
public 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{
@Override
Car 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{
@Override
public 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();
@Override
Car 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{
@Override
public Car getCar() {
return new QiRui();
}
}