*以下仅是本人学习之后的个人总结,有不足之处可以留言讨论。
抽象工厂设计模式的特点:
- 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。
- 系统一次只可能消费其中某一族产品,即同族的产品一起使用。
- 抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建;
优缺点:
- 可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
- 当需要产品族时,抽象工厂可以保证客户端始终只使用同一个产品的产品组。
- 从抽象到具体的过程,易扩展;不需要修改原代码,满足开闭原则;
其缺点是:当产品族(抽象工厂)中需要增加一个新的产品时,所有的工厂类都需要进行修改。增加了系统的抽象性和理解难度。
先定义接口作为抽象工厂去定义有几个抽象类(例如:手机、电脑、键盘等)。
定义不同产品族的接口去实现抽象工厂的接口(例如:小米手机工厂、小米电脑工厂等)。
代码简单实现:
1.AbstrComputer抽象类:
public abstract class AbstrComputer {
public static String name;
private void shutup(){
System.out.println("电脑开机");
}
private void shutdown(){
System.out.println("电脑关机");
}
private void useComputer(){
System.out.println("使用电脑");
}
abstract void methods();
}
2.AbstrPhone抽象类
public abstract class AbstrPhone {
public static String name;
private void shutup(){
System.out.println("手机开机");
}
private void shutdown(){
System.out.println("手机关机");
}
private void usePhone(){
System.out.println("使用手机");
}
abstract void methods();
}
3.HuaWeiComputer类
public class HuaWeiComputer extends AbstrComputer {
public HuaWeiComputer (String name){
HuaWeiComputer.name=name;
}
@Override
void methods() {
System.out.println("华为电脑特有功能");
}
}
4.HuaWeiFactory类
public class HuaWeiFactory implements ProductFactory{
@Override
public AbstrPhone getPhone() {
System.out.println("==============华为手机=================");
return new HuaWeiPhone("新华为手机");
}
@Override
public AbstrComputer getComputer() {
System.out.println("==============华为电脑=================");
return new HuaWeiComputer("新华为电脑");
}
}
5.HuaWeiPhone类
public class HuaWeiPhone extends AbstrPhone{
public HuaWeiPhone(String name){
HuaWeiPhone.name=name;
}
@Override
void methods() {
System.out.println("华为手机特有功能");
}
}
6.MiComputer类
public class MiComputer extends AbstrComputer{
public MiComputer(String name){
MiComputer.name=name;
}
@Override
void methods() {
System.out.println("小米电脑特有功能");
}
}
7.MiFactory类
public class MiFactory implements ProductFactory {
@Override
public AbstrPhone getPhone() {
System.out.println("==============小米手机=================");
return new MiPhone("小米8");
}
@Override
public AbstrComputer getComputer() {
System.out.println("==============小米电脑=================");
return new MiComputer("新小米电脑");
}
}
8.MiPhone类
public class MiPhone extends AbstrPhone{
public MiPhone(String name){
MiPhone.name=name;
}
@Override
void methods() {
System.out.println("小米特有功能");
}
}
9.ProductFactory接口
public interface ProductFactory {
AbstrPhone getPhone();
AbstrComputer getComputer();
}
10.client类(客户端)
public class Client {
public static void main(String[] args) {
AbstrComputer computer = new MiFactory().getComputer();
computer.methods();
AbstrComputer computer1 = new HuaWeiFactory().getComputer();
computer1.methods();
}
}