前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >『设计模式』撩妹秘籍竟是使用设计模式的抽象工厂模式

『设计模式』撩妹秘籍竟是使用设计模式的抽象工厂模式

作者头像
风骨散人Chiam
发布2020-10-28 11:30:58
3740
发布2020-10-28 11:30:58
举报
文章被收录于专栏:CSDN旧文

引入:可以跳过

如果存在一部撩妹的手机,加上一个后宫,请问你该怎么做? 砸了手机,跟老婆孩子好好过日子,本篇文章到此结束!

我们强行分析一波,假设存在一位叫做志强的男主(没有在含沙射影)没有砸掉手机,首先每个姑娘都会有名字,防止太多认错了。 我们把维系关系简单的分成:暧昧–闲聊–约(当然是逛商场啦,别想太多) 对于不同的妹子,肯定采用了不同的暧昧,闲聊,约的方式来俘获他么芳心。 如果重构志强与后宫的关系,那么你会发现志强的撩妹方式,直接和名字挂钩,对于每一位姑娘的暧昧–闲聊–约可以看作是一个产品族。志强在某一时刻可以同时存在多个姑娘,但是在某一时刻只能消费一位姑娘(指的逛商场,且不包含多人运动的情况),那么也就是说志强在某一时刻只消费某一产品族。这就是赤裸裸的抽象工厂模式!

我们以一台计算机主机为例,机箱,主板,cpu,内存条,显卡,硬盘是构成一台主机的组成部分,这里我们有Dell一套,华硕一套,惠普一套,那么每一套就是产品族,因为他们包含了所有组成的他们的产品种类,这就是抽象工厂模式。(打钱!!!)

在这里插入图片描述
在这里插入图片描述
抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

意图:

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

主要解决:

主要解决接口选择的问题。

何时使用:
  • 希望一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节时。
  • 一个系统有多于一个的产品族,而系统只消费其中某一产品族
角色:
  • 抽象工厂(Abstract Factory)角色: 担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。
  • 具体工厂(Concrete Factory)角色: 这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对 象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的
  • 抽象产品(Abstract Product)角色: 担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
  • 具体产品(Concrete Product)角色: 抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。 这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。
在这里插入图片描述
在这里插入图片描述

厂商看到打钱!?

与工厂模式的区别:
  • AbstractFactory模式是为创建一组(有多类)相关或依赖的对象提供创建接口
  • Factory模式是为一类对象提供创建接口
优缺点:

“开放-封闭”原则要求系统对扩展开放,对修改封闭。通过扩展达到增强其功能的目的。对于涉及到多个产品族与多个产品等级结构的系统,其功能增加包括两方面:

  • 增加产品族:Abstract Factory很好的支持了"开放-封闭开放-封闭"原则
  • 增加新产品的等级结构:需要修改所有的工厂角色,没有很好支持“开放-封闭”原则。
  • 综合起来,抽象工厂模式以一种倾斜的方式支持增加新的产品,它为新产品族的增加提供方便,而不能为新的产品等级结构的增加提供这样的方便。

当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。 产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

解决方案: 反射

UML图
在这里插入图片描述
在这里插入图片描述
实现

UML类似上面的,在重新给出一遍。

在这里插入图片描述
在这里插入图片描述

IProductA

代码语言:javascript
复制
package AbstractFactory;
public interface IProductA {
    //每个产品共有的方法
    public void shareMethod();

    // 每个产品相同方法,不同实现
    public  void doSomething();
} 

IProductB

代码语言:javascript
复制
package AbstractFactory;
public interface IProductB {
    //每个产品共有的方法
    public void shareMethod()  ;

    // 每个产品相同方法,不同实现
    public void doSomething();
}

ProductA1

代码语言:javascript
复制
package AbstractFactory;
public class ProductA1 implements IProductA {
    public void doSomething() {
        System.out.println("我是产品A1");
    }

	@Override
	public void shareMethod() {
		// TODO Auto-generated method stub
		
	}
}

ProductA2

代码语言:javascript
复制
package AbstractFactory;
public class ProductA2 implements IProductA {
    public void doSomething() {
        System.out.println("我是产品A2");
    }

	@Override
	public void shareMethod() {
		// TODO Auto-generated method stub
		
	}
}

ProductB1

代码语言:javascript
复制
package AbstractFactory;
public class ProductB1 implements IProductB {
    public void doSomething() {
        System.out.println("我是产品B1");
    }

	@Override
	public void shareMethod() {
		// TODO Auto-generated method stub
		
	}
}

ProductB2

代码语言:javascript
复制
 package AbstractFactory;
public class ProductB2 implements IProductB {
    public void doSomething() {
        System.out.println("我是产品B2");
    }

	@Override
	public void shareMethod() {
		// TODO Auto-generated method stub
		
	}
} 

ICreator

代码语言:javascript
复制
package AbstractFactory;
public interface ICreator {
    //创建A产品
    public   IProductA createProductA();

    //创建B产品
    public  IProductB createProductB();
} 

Creator1

代码语言:javascript
复制
package AbstractFactory;
public class Creator1 implements ICreator {
    public IProductA createProductA() {
        return new ProductA1();
    }

    public IProductB createProductB() {
        return new ProductB1();
    }
}

Creator2

代码语言:javascript
复制
package AbstractFactory;
public class Creator2 implements ICreator {
    public IProductA createProductA() {
        return new ProductA2();
    }

    public IProductB createProductB() {
        return new ProductB2();
    }
}

Client

代码语言:javascript
复制
package AbstractFactory;

public class Client {
    public static void main(String[] args) {
        //定义出两个工厂
        ICreator creator1 = new Creator1();
        ICreator creator2 = new Creator2();
        //产生A1对象
        IProductA a1 = creator1.createProductA();
        //产生A2对象
        IProductA a2 = creator2.createProductA();
        //产生B1对象
        IProductB b1 = creator1.createProductB();
        //产生B2对象
        IProductB b2 = creator2.createProductB();
        a1.doSomething();
        a2.doSomething();
        b1.doSomething();
        b2.doSomething();
    }
}

运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
!!!使用反射加配置文件解耦实现上述过程

去掉所有Creator相关,其余不变。 加上以下内容:

代码语言:javascript
复制
package AbstractFactory;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.util.Properties;

 

public class Reflect_Creator {
	private static String Type = null;
	public  void init() {
		Properties pro = new Properties();
		ClassLoader classLoader = DataAccess.class.getClassLoader();
		InputStream is = classLoader.getResourceAsStream("DataBaseSetting.properties");
		try {
			pro.load(is);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("初始化失败,请检查配置文件");
		}
		Type = pro.getProperty("Type");
	}
    public  IProductA createProductA() throws Exception {
    	Class<?> cls = Class.forName(Type+"1");
		Constructor<?> cs=cls.getConstructor( );
		Object re= cs.newInstance(); 
		return (IProductA) re;
    }

    //创建B产品
    public  IProductB createProductB() throws Exception {
    	Class<?> cls = Class.forName(Type+"2");
		Constructor<?> cs=cls.getConstructor( );
		Object re= cs.newInstance(); 
		return  (IProductB) re;
    }
}  
代码语言:javascript
复制
package AbstractFactory;

public class Client {
    public static void main(String[] args) throws Exception {
       Reflect_Creator.init();
       IProductA A1=Reflect_Creator.createProductA();
       IProductB B1=Reflect_Creator.createProductB();
    }
}

老有人私信我,说我博客表情包花里胡哨的,我想说,我不放表情包,部分小伙伴不一定能看完整篇文章,以后会减少出现,但一定不会缺席。?

写在最后: 我叫风骨散人,名字的意思是我多想可以不低头的自由生活,可现实却不是这样。家境贫寒,总得向这个世界低头,所以我一直在奋斗,想改变我的命运给亲人好的生活,希望同样被生活绑架的你可以通过自己的努力改变现状,深知成年人的世界里没有容易二字。目前是一名在校大学生,预计考研,热爱编程,热爱技术,喜欢分享,知识无界,希望我的分享可以帮到你! 如果有什么想看的,可以私信我,如果在能力范围内,我会发布相应的博文! 感谢大家的阅读!?你的点赞、收藏、关注是对我最大的鼓励!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/05/06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 抽象工厂模式
    • 意图:
      • 主要解决:
        • 何时使用:
          • 角色:
            • 与工厂模式的区别:
              • 优缺点:
                • UML图
                  • 实现
                  • !!!使用反射加配置文件解耦实现上述过程
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档