设计模式——抽象工厂模式
作者:互联网
文章目录
设计模式——抽象工厂模式
1. 理解抽象工厂模式
- 抽象工厂模式并不像其他工厂模式那样可以自由增加新产品,可以容易的调整生产的流水线,它是用来生产不同产品族的全部产品的
- 抽象工厂模式可以看做是工厂模式的升级版,它是可以生产工厂的超级工厂,在有很多个业务品牌、业务分类时,通过抽象工厂模式生产需要的对象是一种非常好的解决方案。
也可以这样来理解抽象工厂模式
2. 使用抽象工厂模式
场景:
现在有分别有两种不同的CPU、屏幕和rom,他们可以组合成多种不同的手机,然后由不同的工厂来生产对应的手机,用户需要时,直接从相应的工厂获取。
2.1 先让工厂知道都有些什么配件
//CPU.java
package com.tsymq.factoryPattern.abstractFactory;
public interface CPU {
public void core();
public void speed();
}
//Screen.java
package com.tsymq.factoryPattern.abstractFactory;
public interface Screen {
public void size();
public void fps();
}
//Rom.java
package com.tsymq.factoryPattern.abstractFactory;
public interface Rom {
public void capacity();
public void rwspeed();
}
2.2 让工厂知道不同配件的信息
//HighCPU.java
package com.tsymq.factoryPattern.abstractFactory;
public class HighCPU implements CPU{
@Override
public void core() {
System.out.println("8 cores.");
}
@Override
public void speed() {
System.out.println("2.4 GHz x8.");
}
}
//LowCPU.java
package com.tsymq.factoryPattern.abstractFactory;
public class LowCPU implements CPU {
@Override
public void core() {
System.out.println("6 cores.");
}
@Override
public void speed() {
System.out.println("1.8GHz x6.");
}
}
//HighScreen.java
package com.tsymq.factoryPattern.abstractFactory;
public class HighScreen implements Screen{
@Override
public void size() {
System.out.println("6.4in 2K.");
}
@Override
public void fps() {
System.out.println("120Hz.");
}
}
//LowScreen.java
package com.tsymq.factoryPattern.abstractFactory;
public class LowScreen implements Screen {
@Override
public void size() {
System.out.println("4.5in 1080P.");
}
@Override
public void fps() {
System.out.println("60Hz.");
}
}
//HighRom.java
package com.tsymq.factoryPattern.abstractFactory;
public class HighRom implements Rom{
@Override
public void capacity() {
System.out.println("256GB.");
}
@Override
public void rwspeed() {
System.out.println("200Mb/s");
}
}
//LowRom.java
package com.tsymq.factoryPattern.abstractFactory;
public class LowRom implements Rom{
@Override
public void capacity() {
System.out.println("32GB.");
}
@Override
public void rwspeed() {
System.out.println("90Mb/s.");
}
}
2.3 现在可以让工厂知道自己改做什么了
//AbstractFactory.java
package com.tsymq.factoryPattern.abstractFactory;
public interface AbstractFactory.java {
public CPU creatCPU();
public Screen creatScreen();
public Rom creatRom();
}
2.4 给工厂分工,各司其职
//HighPhoneFactory
package com.tsymq.factoryPattern.abstractFactory;
public class HighPhoneFactory implements AbstractFactory {
@Override
public CPU creatCPU() {
return new HighCPU();
}
@Override
public Screen creatScreen() {
return new HighScreen();
}
@Override
public Rom creatRom() {
return new HighRom();
}
}
//LowPhoneFactory
package com.tsymq.factoryPattern.abstractFactory;
public class LowPhoneFactory implements AbstractFactory {
@Override
public CPU creatCPU() {
return new LowCPU();
}
@Override
public Screen creatScreen() {
return new LowScreen();
}
@Override
public Rom creatRom() {
return new LowRom();
}
}
2.5 一切就绪,用户有需要就可以从工厂获取产品了
//User3.java
package com.tsymq.factoryPattern.abstractFactory;
public class User3 {
public static void main(String[] args){
//用户可选择自己想要的档次的产品,直接从工厂获取
//获取高端产品,并打印配置信息
HighPhoneFactory factory1 = new HighPhoneFactory();
factory1.creatCPU().core();
factory1.creatCPU().speed();
factory1.creatScreen().size();
factory1.creatScreen().fps();
factory1.creatRom().capacity();
factory1.creatRom().rwspeed();
//获取低端产品,打印配置信息
LowPhoneFactory factory2 = new LowPhoneFactory();
factory2.creatCPU().core();
factory2.creatCPU().speed();
factory2.creatScreen().size();
factory2.creatScreen().fps();
factory2.creatRom().capacity();
factory2.creatRom().rwspeed();
}
}
3. 问题和思考
- 抽象工厂相当于其他工厂的一个超级工厂,它将其他工厂生产的产品组合在一起,生产一个由其他产品构成的新产品,就像xiaomi用几种配件生产xiaomi手机,huawei用其他几种配件来生产huawei手机
- 抽象工厂模式不像简单工厂模式和工厂方法模式那样能直接添加新产品,但他可以生产一个品族的产品,可以在内部返回不同的对象,来达到生产品族的功能
返回不同档次的配件,就可以生产出不同的手机 - 在抽象工厂中添加一个方法,让它多放返回一个对象,也只是为品族添加了一个产品,但生产的还是这个品族,比如在AbstractFactory中添加一个距离感应器或者NFC模块,最后工厂生产的产品还是手机,只是让手机多了一个距离感应或NFC的功能
- 这里使用了3种配件,2种档次,而且只生产了最高配和最低配的两种产品,但文件数量已经达到了12个,如果要生产更多种配置的产品,类和接口的数量还会继续大量增加
- 可以感觉到,使用抽象工厂模式,类、接口的数量已经非常多了,说明这项目会很大,很复杂
标签:tsymq,void,工厂,抽象,abstractFactory,Override,设计模式,public 来源: https://blog.csdn.net/wangyc1234/article/details/100832641