package com.zhaoshuangjian.mode03_抽象工厂模式;
import com.zhaoshuangjian.mode03_抽象工厂模式.abstractfactory.LianXiang01Factory;
import com.zhaoshuangjian.mode03_抽象工厂模式.abstractfactory.LianXiang02Factory;
import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceKeyBord;
import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceMouse;
/**
* 抽象工厂测试 == 具体工厂类实现不同电脑组件的生产
*
* @Author zhaoshuangjian 2023-03-23 下午1:37
*
*
* 工厂方法模式:
* 一个抽象产品类,可以派生出多个具体产品类。
* 一个抽象工厂类,可以派生出多个具体工厂类。
* 每个具体工厂类只能创建一个具体产品类的实例。
*
* 抽象工厂模式:
* 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
* 一个抽象工厂类,可以派生出多个具体工厂类。
* 每个具体工厂类可以创建多个具体产品类的实例,也就是创建的是一个产品线下的多个产品。
*
* 区别:
* 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
* 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
* =====================================================================
* 工厂方法创建 "一种" 产品,他的着重点在于"怎么创建",也就是说如果你开发,
* 你的代码很可能大部分都放在了产品的构造和初始化这些细节上面。也因为如此,
* 类似的产品之间有很多可以复用的特征,所以会和模版方法相随。
*
* 抽象工厂需要创建一系列产品,着重点在于"创建哪些"产品上,也就是说,如果你开发,
* 你的主要任务是划分不同差异的产品线,并且尽量保持每条产品线接口一致,从而可以从同一个抽象工厂继承。
*
*/
public class AbstractFactoryTest {
public static void main(String[] args) {
// 用户需要购买联想的电脑,但要求键盘和鼠标都是雷柏的,于是便找到了对应的01电脑组装工厂进行生产
LianXiang01Factory lianXiang01Factory = new LianXiang01Factory();
ProduceKeyBord keybord1 = lianXiang01Factory.createKeyBord();
keybord1.produceKeyBord("M550", "黑色");
ProduceMouse Mouse1 = lianXiang01Factory.createMouse();
Mouse1.produceMouse("M590", "有线");
System.out.println("=======================分割线,注意区别");
// 用户需要购买联想的电脑,但要求键盘是雷柏的,鼠标是罗技的,于是便找到了对应的02电脑组装工厂进行生产
LianXiang02Factory lianXiang02Factory = new LianXiang02Factory();
ProduceKeyBord keybord2 = lianXiang02Factory.createKeyBord();
keybord2.produceKeyBord("M550", "黑色");
ProduceMouse Mouse2 = lianXiang02Factory.createMouse();
Mouse2.produceMouse("M590", "无线");
/**
* 好处:横向扩展很容易,如果我需要再增加一个电脑型号的生产线,比如HP【惠普】,只需要在创建一个对应的工厂实现抽象工厂即可
* 坏处:纵向扩展很麻烦,如果我需要增加显示器的生产接口,那么改动的地方就太多了,自己领会吧,可以尝试一下
*/
}
}
package com.zhaoshuangjian.mode03_抽象工厂模式.abstractfactory;
import com.zhaoshuangjian.mode03_抽象工厂模式.KeyBoard.LeiBoKeyBord;
import com.zhaoshuangjian.mode03_抽象工厂模式.Mouse.LeiBoMouse;
import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ComputerAbstractFactory;
import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceKeyBord;
import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceMouse;
/**
* 联想电脑生产商 == 电脑型号01【固定键盘和鼠标生产商】
*
* @Author zhaoshuangjian 2023-03-23 下午1:37
*/
public class LianXiang01Factory implements ComputerAbstractFactory {
@Override
public ProduceKeyBord createKeyBord() {
// 使用雷柏的键盘
return new LeiBoKeyBord();
}
@Override
public ProduceMouse createMouse() {
// 使用雷柏的鼠标
return new LeiBoMouse();
}
}
package com.zhaoshuangjian.mode03_抽象工厂模式.abstractfactory;
import com.zhaoshuangjian.mode03_抽象工厂模式.KeyBoard.LeiBoKeyBord;
import com.zhaoshuangjian.mode03_抽象工厂模式.Mouse.LuoJiMouse;
import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ComputerAbstractFactory;
import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceKeyBord;
import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceMouse;
/**
* 联想电脑生产商 == 电脑型号:02【固定键盘和鼠标生产商】
*
* @Author zhaoshuangjian 2023-03-23 下午1:37
*/
public class LianXiang02Factory implements ComputerAbstractFactory {
@Override
public ProduceKeyBord createKeyBord() {
// 使用雷柏的键盘
return new LeiBoKeyBord();
}
@Override
public ProduceMouse createMouse() {
// 使用罗技的鼠标
return new LuoJiMouse();
}
}
package com.zhaoshuangjian.mode03_抽象工厂模式.KeyBoard;
import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceKeyBord;
/**
* 雷柏(Rapoo)键盘生产商
*
* @Author zhaoshuangjian 2023-03-23 下午1:37
*/
public class LeiBoKeyBord implements ProduceKeyBord {
@Override
public void produceKeyBord(String name, String color) {
System.out.println("雷柏键盘 -- "+name+","+color);
}
}
package com.zhaoshuangjian.mode03_抽象工厂模式.KeyBoard;
import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceKeyBord;
/**
* 罗技(G)键盘生产商
*
* @Author zhaoshuangjian 2023-03-23 下午1:37
*/
public class LuoJiKeyBord implements ProduceKeyBord {
@Override
public void produceKeyBord(String name, String color) {
System.out.println("罗技键盘 -- "+name+","+color);
}
}
package com.zhaoshuangjian.mode03_抽象工厂模式.mode03;
/**
* computer抽象工厂接口-只提供电脑组件的组装,具体组装成什么样的型号的电脑,再由具体工厂类决定
*
* @Auther: zhaoshuangjian 2023-03-23 下午1:37
*/
public abstract interface ComputerAbstractFactory {
ProduceKeyBord createKeyBord();
ProduceMouse createMouse();
}
package com.zhaoshuangjian.mode03_抽象工厂模式.mode03;
/**
* 键盘接口 -- 生产键盘
*
* @Author zhaoshuangjian 2023-03-23 下午1:37
*/
public interface ProduceKeyBord {
/**
* 约定键盘生产的规格数据
* @param name 名称
* @param color 颜色
*/
public void produceKeyBord(String name,String color);
}
package com.zhaoshuangjian.mode03_抽象工厂模式.mode03;
/**
* 鼠标接口 -- 生产鼠标
*
* @Author zhaoshuangjian 2023-03-23 下午1:37
*/
public interface ProduceMouse {
/**
* 约定鼠标生产的规格数据
* @param name 名称
* @param type 类型
*/
public void produceMouse(String name,String type);
}
package com.zhaoshuangjian.mode03_抽象工厂模式.Mouse;
import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceMouse;
/**
* 雷柏(Rapoo)鼠标生产商
*
* @Author zhaoshuangjian 2023-03-23 下午1:37
*/
public class LeiBoMouse implements ProduceMouse {
@Override
public void produceMouse(String name, String type) {
System.out.println("雷柏鼠标 -- "+name+","+type);
}
}
package com.zhaoshuangjian.mode03_抽象工厂模式.Mouse;
import com.zhaoshuangjian.mode03_抽象工厂模式.mode03.ProduceMouse;
/**
* 罗技(G)鼠标生产商
*
* @Author zhaoshuangjian 2023-03-23 下午1:37
*/
public class LuoJiMouse implements ProduceMouse {
@Override
public void produceMouse(String name, String type) {
System.out.println("罗技鼠标 -- "+name+","+type);
}
}